如何从BroadcastReceiver类引发警报对话框?

pra*_*gai 4 android broadcastreceiver

我在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);
}
Run Code Online (Sandbox Code Playgroud)

BroadcastReceiverClass.java

public void onReceive(Context context, Intent intent)
{
    dialogMethod();
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能提高一个AlertDialogBroadcastReceiver类从后台进程?

Joe*_*l F 7

如果您的活动在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();
        }
    });

}
Run Code Online (Sandbox Code Playgroud)

如果您将BroadcastReceiver设置为Activity的内部类,则此方法有效.


Luk*_*uth 6

简而言之:这是没有可能的.

只有Activity可以创建/显示对话框.事实上,这已被问过一次:

此外,这会给用户带来非常糟糕的体验:

  • 如果用户不在您的应用程序中(假设他正在玩游戏)并且您的Dialog每15分钟弹出一次,这对他来说非常烦人.
  • 如果用户在您的应用程序中,还有其他几种(更适合的)方式通知他已经执行了某些操作.

更合适的方式

实际上,您可以创建/显示Toast来自BroadcastReceiver.Toast当用户不在"您的应用程序中"时,也会显示此信息.

此外,您还可以发送通知(显示在屏幕顶部的通知栏中)BroadcastReceiver.一个关于如何做到这一点的教程(它不会从你如何在活动中做到这一点不同,不同之处在于使用通过Context从-object onReceive-方法).

当用户不在"您的应用程序"中时,也会显示通知,并且IMO是此问题的最佳解决方案.