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
インテントのタイムスタンプを追加で保存しようと思います。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();
}
}