Как вызвать диалоговое окно оповещения из класса BroadcastReceiver? - PullRequest
4 голосов
/ 29 августа 2011

Я использовал метод таймера в классе Activity. В этом методе у меня есть намерение от Activity класса до BroadcastReceiver класса.

Этот BroadcastReceiver класс будет вызываться каждые 15 минут в фоновом режиме, используя AlarmManager.

Когда я вызываю класс BroadcastReceiver, я хотел бы поднять 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();
}

Как я могу поднять AlertDialog из BroadcastReceiver класса из фонового процесса?

Ответы [ 3 ]

7 голосов
/ 29 августа 2011

Если ваша деятельность выполняется, когда BroadcastReceiver получает намерение, вы должны иметь возможность использовать runOnUiThread для запуска метода, создающего AlertDialog, например:

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();
        }
    });

}

Это работает, если высделайте ваш BroadcastReceiver внутренним классом вашей деятельности.

6 голосов
/ 29 августа 2011

Короче говоря: не возможно.

Только действия могут создавать / показывать диалоги. На самом деле, об этом спрашивали не раз:

Кроме того, это даст очень плохой пользовательский опыт:

  • Если пользователь не в вашем приложении (скажем, он играет Игра) и ваш диалог всплывает каждые 15 минут, это будет очень раздражает его.
  • Если пользователь в вашем приложении, есть несколько других (лучше подходит) способы сообщить ему, что что-то было выполнено.

Лучше подходящие способы

Фактически, вы можете создать / показать Toast из BroadcastReceiver. Это Toast также будет показано, когда пользователь не «в вашем приложении».

Кроме того, вы можете отправить уведомление (отображается в панели уведомлений в верхней части экрана) с BroadcastReceiver. учебник о том, как это сделать (он не отличается от того, как вы это делаете в Activity, за исключением того, что вы используете переданный Context -объект из onReceive -метода).

Уведомление также будет отображаться, когда пользователь не «в вашем приложении» и является IMO лучшим решением этой проблемы.

0 голосов
/ 16 августа 2013

1) В деятельности:

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) В BroadcastReceiver.onReceive:

YourActivity ac= new YourActivity ();
ac.showAlertDialog(YourActivity.ctx, "test", "test");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...