在 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() 中显示对话框的主要内容,如果未能解决你的问题,请参考以下文章

windows控件理论学习

GCM Intent 服务 OnRegistered 没有被调用

GCM原生权限提示——可否更换或调整?

使用 GCM 在 iOS 和 Android 之间进行对话

适用于 Android 谷歌云消息 (GCM) 的 Azure 移动服务从不向设备发送通知

如何将 C2DM 消息显示为推送通知(在 GCMIntentService 类的 onMessage() 函数中接收)