每次打开应用程序时GCM消息显示后的AlertDialog

时间:2012-10-23 18:37:01

标签: android google-cloud-messaging

我正在接收来自GCM的消息。

这是我在GCMBaseIntentService中接收消息的方式:

@Override
protected void onMessage(Context context, Intent intent) {
    String msg = intent.getExtras().getString("message");
    generateNotification(context, msg);
}

private static void generateNotification(Context context, String message) {
    long when = System.currentTimeMillis();
    NotificationManager notificationManager = (NotificationManager)
            context.getSystemService(Context.NOTIFICATION_SERVICE);
    Notification notification = new Notification(R.drawable.ic_launcher, message, when);
    String title = context.getString(R.string.app_name);
    Intent notificationIntent = new Intent(context, MyClass.class);
    notificationIntent.putExtra("message", message);
    notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP |
            Intent.FLAG_ACTIVITY_SINGLE_TOP);
    PendingIntent intent =
            PendingIntent.getActivity(context, 0, notificationIntent, 0);
    notification.setLatestEventInfo(context, title, message, intent);
    notification.flags |= Notification.FLAG_AUTO_CANCEL;
    notification.defaults|= Notification.DEFAULT_LIGHTS;
    notification.defaults|= Notification.DEFAULT_VIBRATE;
    notification.flags |= Notification.FLAG_SHOW_LIGHTS;
    notificationManager.notify(0, notification);
}

MyClass我在onResume中有这个:

String msg = this.getIntent().getStringExtra("message");
if(msg != null){
    new AlertDialog.Builder(this)
    .setTitle("New Notification")
    .setMessage(msg)
    .setNeutralButton("OK", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.cancel();
            }
    }).create().show();
}

GCM消息显示在状态栏中。点击通知后,系统会MyClass打开,并显示上面的AlertDialog

我通过转到新活动,点击返回或点击主页,离开MyClass。当我回到那个活动时,每次返回都会出现`AlertDialog'。

如何防止这种情况?我认为AlertDialog只会在点击状态栏中的通知后立即显示一次。

更新:

所以我认为正在发生的是当我从GCM消息创建通知(generateNotification)时,它会使用这个新意图打开活动。现在,每次打开此活动时,都会重复使用相同的意图,以便再次读取其他内容,然后显示警报。我仍然不知道如何制止这一点。

我想我会尝试使用intent的时间戳存储SharedPreference作为额外的时间戳。然后,我只会在msg == null和时间戳是新的时显示警报。

我喜欢devunwired的答案,但如果有人好奇,将时间戳存储在共享首选项中也是如此。

这就是我实施它的方式:(在MyClass我在onResume中有此内容)

String msg = this.getIntent().getStringExtra("message");
if(msg != null){
    long newTime = intent.getLongExtra("intentTime", 0);
    long oldTime = preferences.getLong("intentTime", 0);

    if(newTime > oldTime){
        new AlertDialog.Builder(this)
        .setTitle("New Notification")
        .setMessage(msg)
        .setNeutralButton("OK", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.cancel();
            }
        }).create().show();
    }
}

1 个答案:

答案 0 :(得分:1)

{J} Intent仍然附加到Activity是正确的,因此onResume()中的每个条目都会执行该代码。它不会被重复使用,只是因为你收到的Intent始终是启动实例的那个,如果你导航到一个新的屏幕并返回,或者点击HOME键因为它不会改变当前实例仍然存在(暂时停止)。

奇怪的是你说它也与BACK一起发生。在BACK按钮的情况下,它应该销毁Activity实例,以便新的启动具有与之关联的不同Intent。除非您下次启动它,否则来自相同的通知或最近的菜单(也会使用之前的Intent启动它)。

您可以尝试将此逻辑移动到onCreate(),只有在新实例进入游戏时才会调用它。另一个选择是在使用新的空白setIntent()处理传入通知后,在Activity上致电Intent,以便后续条目不会启动该代码。