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