如何显示来自非 activity class 的警报对话框
How to show alert dialog from a non activity class
我已经知道 AlertDialog
不能从非 activity class 调用。我也知道我无法在静态方法中使用 AlertDialog
(因此我可以从 class 中调用该方法)。
我想要实现的目标是当用户收到推送通知并点击它时,调用 Receiver
class。在某些情况下,class 正在开始一个新的 activity
,但在其他情况下,它应该显示 alert
说类似的话(这并不是真正写在警报中):You have that activity already running, please stop the activity to start the one from notification.
我无法实现,有什么想法吗?
代码(接收方 class):
@Override
public void onPushOpen(Context context, Intent intent) {
JSONObject pushData = null;
String notificationMessage = "";
Boolean inBattle = getInBattleFromCache(context);
if (inBattle){
showWarningAlert();
}else {
try {
pushData = new JSONObject(intent.getStringExtra("com.parse.Data"));
notificationMessage = pushData.optString("alert");
} catch (JSONException e) {
e.printStackTrace();
}
Log.e("Push", "Clicked:" + pushData);
if (notificationMessage.contains("Your battle")) {
moveToMainActivity(context);
} else {
moveToArena(notificationMessage, true, context);
}
}
}
private void showWarningAlert() {
AlertDialog alertDialog = new AlertDialog.Builder(NoIdeaWhatShouldBeHere.this).create();
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();
}
当我在其中放置 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.access00(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.access00(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)
This 没有帮助。
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);
我已经知道 AlertDialog
不能从非 activity class 调用。我也知道我无法在静态方法中使用 AlertDialog
(因此我可以从 class 中调用该方法)。
我想要实现的目标是当用户收到推送通知并点击它时,调用 Receiver
class。在某些情况下,class 正在开始一个新的 activity
,但在其他情况下,它应该显示 alert
说类似的话(这并不是真正写在警报中):You have that activity already running, please stop the activity to start the one from notification.
我无法实现,有什么想法吗?
代码(接收方 class):
@Override
public void onPushOpen(Context context, Intent intent) {
JSONObject pushData = null;
String notificationMessage = "";
Boolean inBattle = getInBattleFromCache(context);
if (inBattle){
showWarningAlert();
}else {
try {
pushData = new JSONObject(intent.getStringExtra("com.parse.Data"));
notificationMessage = pushData.optString("alert");
} catch (JSONException e) {
e.printStackTrace();
}
Log.e("Push", "Clicked:" + pushData);
if (notificationMessage.contains("Your battle")) {
moveToMainActivity(context);
} else {
moveToArena(notificationMessage, true, context);
}
}
}
private void showWarningAlert() {
AlertDialog alertDialog = new AlertDialog.Builder(NoIdeaWhatShouldBeHere.this).create();
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();
}
当我在其中放置 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.access00(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.access00(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)
This 没有帮助。
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);