2016-04-17 9 views
0

Ok startet, wird angegeben id documentation:
Android Broadcastreceiver warum Popup

Sie können ein Popup-Dialog in Ihrer Implementierung von OnReceive() starten.

Dennoch ist dieser Code beatufilly arbeiten:

public class MainActivity extends AppCompatActivity { 
    final String ACTION = "myActionForBroadcast"; 

    private final BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      Log.d("MyTag", "onReceive: context" + context.getPackageCodePath()); 
      showDialog(); 
     } 
    }; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     IntentFilter filter = new IntentFilter(); 
     filter.addAction(ACTION); 
     registerReceiver(broadcastReceiver, filter); 

     final Handler handler = new Handler(); 
     handler.postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       Log.d("MyTag", "Handler run: before send broadcast"); 
       sendBroadcast(new Intent(ACTION)); 
      } 
     }, 5_000); 
    } 

    private void showDialog() { 
     final AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); 

     builder.setTitle("Title"); 
     builder.setMessage("Message"); 

     builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       Toast.makeText(MainActivity.this, "Dialog: onClick()", Toast.LENGTH_SHORT).show(); 
      } 
     }); 

     Log.d("MyTag", "showDialog: before showing dialog"); 
     builder.show(); 
     Log.d("MyTag", "showDialog: before showing toast"); 
     Toast.makeText(MainActivity.this, "showDialog: showing toast", Toast.LENGTH_SHORT).show(); 
    } 
} 

Warum funktioniert es? Was fehlt mir in der Dokumentation? Danke.

+1

Ja, das ist nicht sehr gut geschrieben. Ich glaube, was sie sagen wollen, ist, dass Sie nicht den 'Context' verwenden können, der an' onReceive() 'übergeben wurde, um einen' Dialog' zu erstellen und anzuzeigen. Ein "Dialog" benötigt einen "Aktivitäts" -Kontext ", den der" Kontext ", der in" onReceive() "übergeben wurde, nicht ist. In deinem Fall ist der 'BroadcastReceiver' eine innere Klasse von' MainActivity', und du verwendest 'MainActivity's' Context', um den 'Dialog' zu erstellen, also ist es gut. –

+0

Ah, ok. Ich sah den kommenden Kontext BroadcastRestrictedContext, etwas in der Art. Aber Toast kann mit diesem Kontext gezeigt werden, oder? –

+1

Ja, Sie können einen 'Toast' mit diesem' Kontext' anzeigen. –

Antwort