Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to raise an alert dialog from BroadcastReceiver class?

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

This BroadcastReceiver class will call on every 15 minutes at background by using AlarmManager.

When I call the BroadcastReceiver class I would like to raise an AlertDialog.

public void timerMethod(){
    Intent intent = new Intent(Activity.this,
      BroadcastReceiverClass.class
    );

    PendingIntent sender = PendingIntent.getBroadcast(
      QualityCallActivity.this,0, intent, 0
    );

    // We want the alarm to go off 30 seconds from now.
    long firstTime = SystemClock.elapsedRealtime();

    AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);
    am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
    firstTime, 60*1000, sender);
}

BroadcastReceiverClass.java

public void onReceive(Context context, Intent intent)
{
    dialogMethod();
}

How can I raise an AlertDialog from BroadcastReceiver class from a background process?

like image 871
prasad.gai Avatar asked Dec 16 '22 10:12

prasad.gai


2 Answers

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.

like image 76
Joel F Avatar answered Mar 15 '23 10:03

Joel F


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.

like image 32
Lukas Knuth Avatar answered Mar 15 '23 11:03

Lukas Knuth