Android Notification PendingIntent Extras null
Я пытаюсь отправить информацию из уведомления на вызванную активность, в то время как из моей активности я получил нуль.
Код для уведомления:
private void showNotification() {
Intent resultIntent = new Intent(this, MainActivity.class);
if (D)
Log.d(TAG, "Id: " + Id);
resultIntent.putExtra("ineedid", deviceId);
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
stackBuilder.addParentStack(MeterActivity.class);
stackBuilder.addNextIntent(resultIntent);
PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0,
PendingIntent.FLAG_UPDATE_CURRENT);
// Bundle tmp = resultIntent.getExtras();
// if (tmp == null) {
// Log.d(TAG, "tmp bundle is null");
// } else {
// long id = tmp.getLong("ineedid", -1);
// Log.d(TAG, "tmp id : " + id);
// }
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
BLEMessengerService.this)
.setSmallIcon(R.drawable.ic_action_search)
.setContentTitle("Event tracker")
.setContentText("Events received").setOngoing(true)
.setContentIntent(resultPendingIntent)
.setWhen(System.currentTimeMillis());
int mId = R.string.service_notification_start_service;
mNM.notify(mId, mBuilder.getNotification());
}
Код для получения информации от намерения в основной деятельности;
Bundle extras = getIntent().getExtras();
if (extras != null) {
long deviceID = getIntent().getLongExtra("ineedid",
-1);
if (ID == -1) {
if (D)
Log.i(TAG_D, "Wrong Id received.");
finish();
} else {
device = dataSource.getDeviceByID(deviceID);
if (D)
Log.i(TAG_D, "Get the id.");
}
} else {
if (D)
Log.d(TAG_D, "Bundle is null");
finish();
}
Я проверял, прежде чем уведомление получит уведомление, пакет не является нулевым, и он имеет идентификатор в дополнительных функциях.
Хотя, когда я пытался получить его от намерения, он исчез. Справка.
Ответы
Ответ 1
Я только что получил ответ,
добавить строку: resultIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
УВЕДОМЛЕНИЕ: если вы добавите его как resultIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
Это не сработает.
Я также пробовал использовать другие флаги, такие как "FLAG_ACTIVITY_NEW_TASK" и "FLAG_ACTIVITY_RESET_TASK_IF_NEEDED". здесь не работает.
Ответ 2
Для меня, помимо установки Intent.FLAG_ACTIVITY_SINGLE_TOP, мне пришлось добавить уникальное действие к намерению:
Intent resultIntent = new Intent(caller, NotificationActivity.class);
String xId = getNextUniqueId();
resultIntent.putExtra("x_id", xId);
resultIntent.setAction(xId);
resultIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
.. без setAction (..), Extras имеет значение null для Intent, полученного моей NotificationActivity.
Это сообщение помогает объяснить это: fooobar.com/questions/167661/...
Ответ 3
в PendingIntent используйте этот флаг PendingIntent.FLAG_UPDATE_CURRENT
он работает для меня
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
Ответ 4
Я работал в локальном плагине уведомлений для Unity, когда столкнулся с той же проблемой → я запустил приложение, запланировал локальное уведомление, отправил приложение в фоновый режим, появилось локальное уведомление и, когда я нажал на него, приложение было возобновлено и getIntent().getExtras()
было null
.
В моем случае проблема заключалась в том, что я пытался получить дополнительные услуги с неправильным намерением. Попробуйте напечатать намерения с помощью простой toString в момент создания и когда вы ее получите, чтобы убедиться, что полученное является тем, что вы ожидаете.
Также рассмотрите метод onNewIntent.