我正在接收来自 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();
}
}