在一个 activity 中设置的警报需要在另一个中显示

Alert set up in one activity needs to show in another

我有一个 Main activity 等待来自 Web 服务的随机消息并处理它们。该过程完成后,它会向用户显示一条消息。用户并不总是在主 activity 中,因此即使进程是 运行,他们也不会收到消息,直到他们 return 到主 activity。问题是当用户不在主 activity 中时是否可以向他们显示消息?这是我在主要 activity:

中使用的代码
public void showAuthRequested(String val) {
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle("auth requested");
    builder.setMessage("requesting authorization, do you accept?");


    builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialogInterface, int i) {
            authorized = false;
            SharedPreferences pref1 = getApplicationContext().getSharedPreferences("Mysets", 0); // 0 - for private mode
            SharedPreferences.Editor editor = pref1.edit();
            editor.putBoolean("authorized",false);
            editor.commit();
            webRequests("https://xxx.xxx.xxx.xxx/xxx/xxx/accessResult.php", "true");
        }
    });
    builder.setNegativeButton("Cancel", null);

    // create and show the alert dialog
    final AlertDialog dialog = builder.create();

    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            dialog.show();
        }
    });

我尝试根据 Prashant.J 的评论添加广播接收器

public class AuthReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
// TODO: This method is called when the BroadcastReceiver is receiving
// an Intent broadcast.
//throw new UnsupportedOperationException("Not yet implemented");



AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle("Transfer mission requested");
builder.setMessage("EUD is requesting control, do you accept?");
builder.setNegativeButton("Cancel", null);
builder.setPositiveButton("ok",null);
final AlertDialog dialog = builder.create();
dialog.show();

}

但是我遇到了这个错误

E/AndroidRuntime:致命异常:主进程:[​​=25=].nglsv3,PID:14742 java.lang.RuntimeException:无法启动接收器 com.goldlink.nglsv3.AuthReceiver: android.view.WindowManager$BadTokenException: 无法添加 window -- 令牌 null 无效;你的activity运行宁吗?在 android.app.ActivityThread.handleReceiver(ActivityThread.java:3614) 在 android.app.ActivityThread.access$1300(ActivityThread.java:238) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java: 1798) 在 android.os.Handler.dispatchMessage(Handler.java:106) 在 android.os.Looper.loop(Looper.java:214) 在 android.app.ActivityThread.main(ActivityThread.java:7073) 在java.lang.reflect.Method.invoke(本机方法)在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:965) 由:android.view.WindowManager$BadTokenException: 无法添加 window -- 令牌 null 无效;你的activity运行宁吗?在 android.view.ViewRootImpl.setView(ViewRootImpl.java:1056) 在 android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:381) 在 android.view.WindowManagerImpl.addView(WindowManagerImpl.java:93 ) 在 android.app.Dialog.show(Dialog.java:470) 在 com.goldlink.nglsv3.AuthReceiver.onReceive(AuthReceiver.java:27) 在 android.app.ActivityThread.handleReceiver(ActivityThread.java:3605) 在 android.app.ActivityThread.access1300 美元(ActivityThread.java:238) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1798) 在 android.os.Handler.dispatchMessage(Handler.java:106) 在 android.os.Looper.loop(Looper.java:214) 在 android.app.ActivityThread.main(ActivityThread.java:7073) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:965) I/Process: 发送信号。 PID:14742 SIG:9 与目标 VM 断开连接,地址:'localhost:8617',传输:'sock

根据我的评论,我正在编写以下步骤。

  1. 使用 onReceive() 方法编写 BroadcastReceiver class。
  2. 使用正确的 intent-filter 在清单文件中声明 BroadcastReceiver
  3. 在您的 MainActivity-> 收到来自网络服务的响应后发送此广播。如果你愿意,你可以添加任何消息。
  4. 在 BroadcastReceive 的 OnReceive() 方法中使用 intent.getAction()
  5. 检查此意图操作
  6. 从那里打开 activity 将显示一个对话框。

按代码获取更多信息。见下文 link。 show an alert dialog in broadcast receiver after a system reboot