How to raise an alert dialog from BroadcastReceiver class?

前端 未结 3 843
孤街浪徒
孤街浪徒 2020-12-18 08:29

I have used a timer method in an Activity class. In that method I have an intent from Activity class to a BroadcastReceiver class.

相关标签:
3条回答
  • 2020-12-18 09:11

    In short: It is not possible.

    Only Activity's can create/show dialogs. In fact, this has been asked more then once:

    • AlertDialog in BroadcastReceiver
    • How can I display a dialog from an Android broadcast receiver?

    Also, this would give a very bad user-experience:

    • If the user is not in your application (let's say he's playing a Game) and your Dialog pops up every 15 minutes, this will be very annoying for him.
    • If the user is in your application, there are several other (better suited) ways to notify him that something has been executed.

    Better suited ways

    In fact, you can create/show a Toast from an BroadcastReceiver. This Toast will also bee shown when the user is not "in your application".

    Also, you can send a Notification (shown in the Notification-Bar at the top of your screen) from a BroadcastReceiver. A tutorial on how to do this (it does not differ from how you do it in an Activity, except that you use the passed Context-Object from the onReceive-method).

    The Notification will also be shown when the user is not "in your application" and is IMO the best solution to this problem.

    0 讨论(0)
  • 2020-12-18 09:14

    1) In Activity:

    public static Context ctx;
    
    onCreate {
        ctx = this;
    }
    
    public void showAlertDialog(Context context, String title, String message) {
    
        final AlertDialog alertDialog = new AlertDialog.Builder(context).create();
        // Setting Dialog Title
        alertDialog.setTitle(title);
    
        // Setting Dialog Message
        alertDialog.setMessage(message);
    
        // Setting OK Button
        alertDialog.setButton(DialogInterface.BUTTON_POSITIVE, "Okay",
          new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) 
            {
                alertDialog.dismiss();
            }
        });
    
        // Showing Alert Message
        alertDialog.show();
    }
    

    2) In BroadcastReceiver.onReceive:

    YourActivity ac= new YourActivity ();
    ac.showAlertDialog(YourActivity.ctx, "test", "test");
    
    0 讨论(0)
  • 2020-12-18 09:22

    If your activity is running when the BroadcastReceiver gets the intent you should be able to use runOnUiThread to run a method that creates an AlertDialog, e.g.:

    public void onReceive(Context context, Intent intent)
    {
        runOnUiThread(new Runnable() {
            public void run() {
                AlertDialog.Builder d = new AlertDialog.Builder(MyActivity.this);
                b.setMessage("This is a dialog from within a BroadcastReceiver");
                b.create().show();
            }
        });
    
    }
    

    This works if you make your BroadcastReceiver an inner class to your Activity.

    0 讨论(0)
提交回复
热议问题