我正在接收来自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();
}
}
答案 0 :(得分:1)
{J} Intent
仍然附加到Activity
是正确的,因此onResume()
中的每个条目都会执行该代码。它不会被重复使用,只是因为你收到的Intent
始终是启动实例的那个,如果你导航到一个新的屏幕并返回,或者点击HOME键因为它不会改变当前实例仍然存在(暂时停止)。
奇怪的是你说它也与BACK一起发生。在BACK按钮的情况下,它应该销毁Activity
实例,以便新的启动具有与之关联的不同Intent
。除非您下次启动它,否则来自相同的通知或最近的菜单(也会使用之前的Intent
启动它)。
您可以尝试将此逻辑移动到onCreate()
,只有在新实例进入游戏时才会调用它。另一个选择是在使用新的空白setIntent()
处理传入通知后,在Activity
上致电Intent
,以便后续条目不会启动该代码。