Уведомления в строке состояния Android - Намерение получить старые дополнения во второй раз - PullRequest
19 голосов
/ 09 февраля 2012

Когда я создаю уведомление, которое отправляется через C2DM и принимается в моем приложении, я хочу передать некоторые данные, которые пришли с push-уведомлением из C2DM, в дополнительные функции. Это работает нормально, когда я открываю свое уведомление в первый раз. Затем данные принимаются с помощью onNewIntent или onCreate в зависимости от состояния действия.

Но если я отправлю второе push-уведомление через C2DM, оно будет получено правильно с новыми данными, но при получении дополнений из намерения я все же получу данные из предыдущего сообщения. Заголовок и данные, которые я хочу видеть, правильно отображаются в уведомлении. Так что что-то должно быть не так в моих намерениях. Это происходит, если действие выполняется, а если нет.

Для создания уведомления я делаю следующее:

NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
Notification notification = new Notification(R.drawable.ic_stat_notify_push, "Message received", System.currentTimeMillis());
notification.flags |= Notification.FLAG_AUTO_CANCEL;
notification.sound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
notification.defaults |= Notification.DEFAULT_LIGHTS;
Intent intent = new Intent(context, DesktopApp.class);
intent.setAction("android.intent.action.MAIN");
intent.addCategory("android.intent.category.LAUNCHER");
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
intent.putExtra("msg_id", msg_id);
intent.putExtra("title", title);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
notification.setLatestEventInfo(context, "New message", title + String.valueOf(msg_id), pendingIntent);
notificationManager.notify(0, notification);

Чтобы затем прочитать намерения:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    Intent myIntent = getIntent(); // this is just for example purpose
    int i = myIntent.getIntExtra("msg_id", -1);
    if (i != -1) Toast.makeText(this, "Got message! " + String.valueOf(i), Toast.LENGTH_LONG).show();
}


@Override
public void onNewIntent(Intent intent){
    super.onNewIntent(intent);
    Bundle extras = intent.getExtras();
    if (extras != null) {
        int i = extras.getInt("msg_id", -1);
        if (i != -1) Toast.makeText(this, "Got message! " + String.valueOf(i), Toast.LENGTH_LONG).show();
    }
}

Есть предложения?

Ответы [ 2 ]

37 голосов
/ 09 февраля 2012

Вам необходимо установить флаг очистки на PendingIntent:

PendingIntent pintent = 
   PendingIntent.getActivity(context,0,intent,PendingIntent.FLAG_CANCEL_CURRENT);

Посмотрите на этот пост , который дает более длинное объяснение.

5 голосов
/ 24 февраля 2012

Используйте это

PendingIntent pi = PendingIntent.getActivity(context, UNIQUE_ID, 
    intent, PendingIntent.FLAG_UPDATE_CURRENT);
...