在 GCM onMessage() 中显示对话框
Posted
技术标签:
【中文标题】在 GCM onMessage() 中显示对话框【英文标题】:Show Dialog in GCM onMessage() 【发布时间】:2012-09-11 20:55:20 【问题描述】:我正在将 GCM(Google Cloud Messaging)实施到我的应用中。
我按照 Google 教程中的方式进行了设置,到目前为止它可以正常工作。
当onMessage
被调用时,我会在通知栏中显示一条通知。
现在我有一个方法可以告诉我应用程序是否在前台。 当应用程序处于后台时,它会在栏中显示通知,没有问题。
但是我怎样才能向用户显示一个对话框呢?
当我打电话时:
AlertDialog.Builder builder = new AlertDialog.Builder(context);
其中 context 是来自onMessage()
的给定上下文,我当然是这个错误:
_Notification.showPopUp() 错误:android.view.WindowManager$BadTokenException:无法添加窗口 -- 令牌 null 不适用于应用程序
所以我尝试用MainActivity.this
替换上下文,为此我将它保存在一个静态变量中;但是当我现在运行它时,什么也没有发生,没有错误,没有对话框出现。
我的对话框代码:
private static AlertDialog.Builder myAlertDialog;
private static void showPopUp(Context context,String kind, String resource_name, Integer resource_id)
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setMessage("Are you sure you want to exit?")
.setCancelable(false)
.setPositiveButton("Yes", new DialogInterface.OnClickListener()
public void onClick(DialogInterface dialog, int id)
)
.setNegativeButton("No", new DialogInterface.OnClickListener()
public void onClick(DialogInterface dialog, int id)
dialog.cancel();
);
AlertDialog alert = builder.create();
alert.show();
Log.e("TEST","alert.show()");
最后一条日志:alert.show() 显示在 logcat 中,但没有错误。
规格: 在设备上运行 (Galaxy S2) 安卓4.0.3
有人可以告诉我我的代码有什么问题吗,或者有人知道一些解决方法吗?
编辑:
我保存MainActivity.this
的部分:
private static Context context_forshowingPopUp = null;
onCreate
//Set the context for showing a popup View
_Notification.setContext_forshowingPopUp(this);
AlertDialog.Builder builder = new AlertDialog.Builder(getContext_forshowingPopUp());
public static Context getContext_forshowingPopUp()
return context_forshowingPopUp;
public static void setContext_forshowingPopUp(Context context_forshowingPopUp)
_Notification.context_forshowingPopUp = context_forshowingPopUp;
【问题讨论】:
备案:如果应用不在前台,您仍然可以使用通知区域。请参阅类 NotificationManager。 是的,我知道,但是当用户准备好使用应用程序时,在通知栏中收到通知似乎不太合乎逻辑。 android 设计模式中是否有关于此用例的任何信息? 只需在某个静态可访问的地方维护指向当前活动的指针。在应用程序中每个活动的 onResume() 中设置它,在 onPause() 中清除。如果所有活动都源自自定义的公共基础,则会有所帮助。 我试过了,不行! :/。还有其他想法吗? 如果我将我的活动保存在一个静态变量中并且我不想打开对话框,那么什么都不会发生,没有错误,没有 logcat 条目或其他东西。 【参考方案1】:在构建 Alertdialog 时,您必须使用 YourCurrentActivity.this 作为上下文。你可以像下面这样解决。
头等舱:
public class Config
public static Context context;
当您的活动创建时,只需设置 Config.contex
public class MyActivity extends Activity
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
Config.context=this;
...
//other stuffs
在 OnMessage 中
showPopUp(Config.context,kind, resource_name, resource_id);
【讨论】:
我有一个私有静态上下文 context_forshowingPopUp;我做的事情和你完全一样。但它不起作用。我将更新我的问题,以展示这部分。谢谢 java.lang.RuntimeException: Handler (android.view.ViewRootImpl) 41929ee8 向死线程上的 Handler 发送消息 - 这是我使用此解决方案在 log cat 中得到的结果 我想说这是导致全局状态错误的另一个原因:保留对主要活动的引用并不能保证该活动在需要时会保持活动状态。以上是关于在 GCM onMessage() 中显示对话框的主要内容,如果未能解决你的问题,请参考以下文章
GCM Intent 服务 OnRegistered 没有被调用