1

我正在接收来自 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单击状态栏中的通知后只会立即出现一次。

更新:

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

我想我将尝试将SharedPreference带有意图的时间戳的 a 存储为额外的。然后我只会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();
    }
}
4

1 回答 1

1

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

奇怪的是你说它也发生在 BACK 上。在 BACK 按钮的情况下,它应该销毁Activity实例,以便新的启动将Intent与它有不同的关联。除非您下次启动它是从同一个通知或最近菜单(也将与前一个启动它Intent)。

您可以尝试将此逻辑移动到onCreate()中,它只会在新实例开始发挥作用时被调用。另一种选择是在您使用新空白处理传入通知后调用setIntent(),以便后续条目不会启动该代码。ActivityIntent

于 2012-10-23T20:55:59.480 回答