Android 如何从非活动类显示警报对话框

Android 如何从非活动类显示警报对话框,android,android-activity,android-alertdialog,Android,Android Activity,Android Alertdialog,我已经知道,AlertDialog不能从非活动类调用。我还知道我不能在静态方法中使用AlertDialog(因此我可以从类中调用该方法) 我想要实现的目标是,当用户收到推送通知并单击它时,调用一个Receiver类。在某些情况下,该类正在启动一个新的活动,但在其他情况下,它应该显示警报这样说(这不是真正用警报编写的):如果该活动已在运行,请停止该活动以从通知中启动该活动。 我做不到,知道吗 代码(接收器类别): 当我将context变量放在那里时,它会抛出以下错误: 05-11 15:27:07

我已经知道,
AlertDialog
不能从非活动类调用。我还知道我不能在静态方法中使用
AlertDialog
(因此我可以从类中调用该方法)

我想要实现的目标是,当用户收到推送通知并单击它时,调用一个
Receiver
类。在某些情况下,该类正在启动一个新的
活动
,但在其他情况下,它应该显示
警报
这样说(这不是真正用警报编写的):
如果该活动已在运行,请停止该活动以从通知中启动该活动。

我做不到,知道吗

代码(接收器类别):

当我将
context
变量放在那里时,它会抛出以下错误:

05-11 15:27:07.665    1692-1692/com.parse.starter E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to start receiver com.parse.starter.Receiver: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
        at android.app.ActivityThread.handleReceiver(ActivityThread.java:2431)
        at android.app.ActivityThread.access$1500(ActivityThread.java:141)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1332)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:5103)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:525)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
        at dalvik.system.NativeStart.main(Native Method)
 Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
        at android.view.ViewRootImpl.setView(ViewRootImpl.java:563)
        at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:269)
        at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
        at android.app.Dialog.show(Dialog.java:281)
        at com.parse.starter.Receiver.showWarningAlert(Receiver.java:61)
        at com.parse.starter.Receiver.onPushOpen(Receiver.java:32)
        at com.parse.ParsePushBroadcastReceiver.onReceive(ParsePushBroadcastReceiver.java:115)
        at android.app.ActivityThread.handleReceiver(ActivityThread.java:2424)
            at android.app.ActivityThread.access$1500(ActivityThread.java:141)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1332)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:5103)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:525)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
            at dalvik.system.NativeStart.main(Native Method)
没有帮助

private void showWarningAlert(Context context) { //Added argument
    AlertDialog alertDialog = new AlertDialog.Builder(context).create(); //Use context
    alertDialog.setTitle("Warning");
    alertDialog.setMessage("You are currently in a battle");
    alertDialog.setButton(AlertDialog.BUTTON_NEUTRAL, "OK",
            new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    dialog.dismiss();
                }
            });
    alertDialog.show();
}
假设onPushOpen中的上下文是正确的

    showWarningAlert(context);
假设onPushOpen中的上下文是正确的

    showWarningAlert(context);
假设onPushOpen中的上下文是正确的

    showWarningAlert(context);
假设onPushOpen中的上下文是正确的

    showWarningAlert(context);


我发誓我试过了,但没用。。。天啊。谢谢,好像就是这样。我一定试过类似于
context.getClass()
之类的东西…@OndrejTokar很乐意帮忙。你也能接受吗?谢谢,我发誓我试过了,但没用。。。天啊。谢谢,好像就是这样。我一定试过类似于
context.getClass()
之类的东西…@OndrejTokar很乐意帮忙。你也能接受吗?谢谢,我发誓我试过了,但没用。。。天啊。谢谢,好像就是这样。我一定试过类似于
context.getClass()
之类的东西…@OndrejTokar很乐意帮忙。你也能接受吗?谢谢,我发誓我试过了,但没用。。。天啊。谢谢,好像就是这样。我一定试过类似于
context.getClass()
之类的东西…@OndrejTokar很乐意帮忙。你也能接受吗?感谢您不熟悉onPushOpen。当上下文错误时会发生错误-什么是作为上下文传递到该函数中的?没关系,我会将您的答案标记为正确答案,因为我确信上下文内容存在问题。这是因为我使用parse.com。我用烤面包代替。。。谢谢:)好的。Alertdialog需要要从中显示的活动实例。通常,您可以通过执行getActivity()来实现此目的。这是一个简单的过程,但我不知道您从何处调用函数。您可以使用toast,但会遇到相同的问题。toast有效。该函数是从manifest.xml定义自动调用的。不熟悉onPushOpen。当上下文错误时会发生错误-什么是作为上下文传递到该函数中的?没关系,我会将您的答案标记为正确答案,因为我确信上下文内容存在问题。这是因为我使用parse.com。我用烤面包代替。。。谢谢:)好的。Alertdialog需要要从中显示的活动实例。通常,您可以通过执行getActivity()来实现此目的。这是一个简单的过程,但我不知道您从何处调用函数。您可以使用toast,但会遇到相同的问题。toast有效。该函数是从manifest.xml定义自动调用的。不熟悉onPushOpen。当上下文错误时会发生错误-什么是作为上下文传递到该函数中的?没关系,我会将您的答案标记为正确答案,因为我确信上下文内容存在问题。这是因为我使用parse.com。我用烤面包代替。。。谢谢:)好的。Alertdialog需要要从中显示的活动实例。通常,您可以通过执行getActivity()来实现此目的。这是一个简单的过程,但我不知道您从何处调用函数。您可以使用toast,但会遇到相同的问题。toast有效。该函数是从manifest.xml定义自动调用的。不熟悉onPushOpen。当上下文错误时会发生错误-什么是作为上下文传递到该函数中的?没关系,我会将您的答案标记为正确答案,因为我确信上下文内容存在问题。这是因为我使用parse.com。我用烤面包代替。。。谢谢:)好的。Alertdialog需要要从中显示的活动实例。通常,您可以通过执行getActivity()来实现此目的。这是一个简单的过程,但我不知道您从何处调用函数。您可以使用toast,但会遇到相同的问题。toast有效。该函数将从manifest.xml定义中自动调用。