Android 在一个活动中设置的警报需要在另一个活动中显示

Android 在一个活动中设置的警报需要在另一个活动中显示,android,alert,Android,Alert,我有一个主活动,它等待并处理来自web服务的随机消息。流程完成后,会向用户显示一条消息。用户并不总是在主活动中,因此即使流程正在运行,他们也不会收到消息,直到他们返回到主活动。问题是,当用户不在主活动中时,是否可以向其显示消息?这是我在主要活动中使用的代码: public void showAuthRequested(String val) { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder

我有一个主活动,它等待并处理来自web服务的随机消息。流程完成后,会向用户显示一条消息。用户并不总是在主活动中,因此即使流程正在运行,他们也不会收到消息,直到他们返回到主活动。问题是,当用户不在主活动中时,是否可以向其显示消息?这是我在主要活动中使用的代码:

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:致命异常:主进程:com.goldlink.nglsv3,PID:14742 java.lang.RuntimeException:无法启动接收器com.goldlink.nglsv3.AuthReceiver:android.view.WindowManager$BadTokenException:无法添加窗口--标记null无效;你的活动正在进行吗?在android.app.ActivityThread.HandlerReceiver(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.maincom.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494)上的java.lang.reflect.Method.invoke(本机方法)上的ActivityThread.java:7073原因:android.view.WindowManager$BadTokenException:无法添加窗口--标记null无效;您的活动是否正在运行?在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.HandlerReceiver(ActivityThread.java:3605)在android.app.ActivityThread.access$1300(ActivityThread.java:238)在android.app.ActivityThread$H.handleMessage(ActivityThread.java:1798)上android.app.ActivityThread.main(ActivityThread.java:7073)的android.os.Handler.dispatchMessage(Handler.java:106)的android.os.Looper.loop(Looper.java:214)的android.app.ActivityThread.java:7073的java.lang.reflect.Method.invoke(Native Method)的com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494)的com(ZygoteInit.java:965)I/Process:Sending signal.PID:14742 SIG:9与目标VM断开连接,地址:'localhost:8617',传输:'sock

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

  • 使用onReceive()方法编写BroadcastReceiver类
  • 使用正确的意图筛选器在清单文件内声明BroadcastReceiver
  • 在MainActivity->中,在收到web服务的响应后发送此广播。如果需要,您可以额外发送任何消息
  • 在BroadcastReceive()的OnReceive()方法中,使用intent.getAction()检查此意图操作
  • 从那里打开活动,它将显示一个对话框
  • 有关代码的详细信息,请参阅下面的链接。

    您是否考虑过改用
    通知
    ?它肯定比
    对话框更方便用户使用,而
    对话框可能会在他们在其他地方忙碌时突然弹出。在这里使用自定义广播将非常合适:)从web服务获得响应后,您需要从MAinActivity发送广播,并在broadcast receiver类的onReceive方法中编写AlertDialog。就是这样。您不能从清单注册的接收器显示
    对话框
    。对话框
    需要
    活动
    作为其
    上下文通知的问题是用户只有15秒的时间来回复评论,否则可能会发生他们不想发生的事情。因此,无论他们是否愿意,他们都必须获得一个弹出窗口。这是我的要求。如果这是绝对必要的,那么你为什么不启动另一个
    活动
    ?你甚至可以通过使用
    对话框
    主题,让它看起来像一个对话框,你几乎可以在应用程序的任何地方调用它(尽管你可能需要启动一个新任务)。我还想提到的是,不应该依赖于当前不在前台的
    活动中所做的任何后台工作。你应该在
    服务中这样做,最好是在前台
    服务中这样做,因为你无论如何都需要
    通知。你是说我可以使用警报拨号吗onReceive()方法中的og?当我尝试时,我在节目中遇到了一个异常。异常是什么?是否检查了您是否在Ui线程上?从后台进入主线程后发送广播:)还检查您是否使用了正确的上下文。把你的错误贴在这里,我可以帮你更多。你从哪里发的广播?您需要发送自定义广播,并在onReceive()内检查相同的广播。不能直接在onReceive方法中显示警报。活动只能显示警报。在广播接收器中,启动活动以显示警报。我已编辑我的答案。请看一看并按照链接内的代码进行操作。这将帮助你:)这些例子都是多余的。没有理由启动一个
    活动
    ,只是为了从中显示一个
    对话框
    。只需在
    活动
    上设置一个
    主题。*.Dialog
    ,并将其用作
    对话框
    。仅供参考。