Уведомление Android PendingIntent Extras null

Я пытаюсь отправить информацию из уведомления в вызванную активность, а из моей активности я получил 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();
}

Я проверил, прежде чем уведомление получит уведомление, пакет не является нулевым, и у него есть идентификатор в дополнениях. Хотя, когда я попытался получить его из намерения, он исчез. Помощь.


person antonio081014    schedule 28.11.2012    source источник
comment
Я также попытался добавить resultIntent.addFlags (Intent.FLAG_ACTIVITY_SINGLE_TOP);, но безуспешно.   -  person antonio081014    schedule 28.11.2012
comment
Есть причина, по которой вы не используете resultPendingIntent.getExtras()?   -  person PearsonArtPhoto    schedule 28.11.2012
comment
Я просто сделал эти строки, чтобы проверить, есть ли в моем pendingIntent Extras, и подтвердил, что в нем есть то, что я туда положил.   -  person antonio081014    schedule 28.11.2012
comment
Если вы работаете с FCM, обычно уведомление обрабатывается самим Android, и, следовательно, ваше Уведомление при нажатии не имеет дополнительных функций. Для получения дополнительной информации см .: stackoverflow.com/questions/37358462/   -  person Reejesh PK    schedule 02.10.2018


Ответы (6)


в PendingIntent используйте этот флаг PendingIntent.FLAG_UPDATE_CURRENT это работает для меня

PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
person Oubaida AlQuraan    schedule 28.03.2016
comment
Работает! Спасибо!! - person User9211; 16.03.2021
comment
Если вы собирались использовать его только один раз, вы можете использовать это. Но если вам нужно, чтобы несколько PendingIntents были действительными одновременно, FLAG_UPDATE_CURRENT оставит вам только самое последнее намерение как действительное. Возможное решение - intent.flag_activity_new_task - person user5646514; 25.06.2021

Для меня, помимо установки 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.

Этот пост помогает объяснить это: https://stackoverflow.com/a/3128271/2162226

person Gene Bo    schedule 04.06.2014
comment
В одном из моих намерений было одно дополнительное (логическое), но не было другого. Указание любого действия исправляет это, и внезапно теперь присутствуют оба дополнения! Спасибо. - person cainy393; 03.04.2020

Когда действие запускается (когда оно запускается впервые) или перезапускается (когда оно перемещается в верхнюю часть стека), getIntent().getExtra() не дает null. Но когда действие присутствует в вершине стека, тогда при запуске этого действия с использованием PendingIntent действие не будет перезапущено (onCreate() не будет вызвано), вместо этого будет вызываться onResume(). И getIntent().getExtra() вернет значение, связанное с намерением, запустившим действие (то есть null).
Чтобы обновить намерение, выполните следующие действия:

1). Установите флаги FLAG_ACTIVITY_SINGLE_TOP и FLAG_ACTIVITY_CLEAR_TOP в своем намерении.

resultIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);

2). Переопределить onNewIntent() в действии, в котором вызывается getIntent().getExtra(). Этот метод вызывается FLAG_ACTIVITY_SINGLE_TOP

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    setIntent(intent);
}

Для получения дополнительной информации: см. Этот документ

person Neeraj Sewani    schedule 03.09.2018
comment
Четкое и правильное объяснение, это должен быть принятый ответ - person Arthur; 12.03.2019
comment
Отлично! Это правильный ответ, и он дает бесплатное простое объяснение. ???? Я хотел бы добавить дополнительную информацию: в моем случае у меня возникла одна дополнительная проблема: намерение сохраняется после первого вызова, а это означает, что при возобновлении работы приложения в последующих квантах запрограммированное поведение повторяется, потому что Intent остается прежним. Чтобы избежать этого, я добавил onResume getIntent().removeExtra("the_no-more-desired_extra") в правильном стратегическом месте. - person elnezah; 06.08.2020

Я только что получил ответ, добавьте строку: resultIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

ВНИМАНИЕ: если вы добавите его как resultIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);, это не сработает.

Я также пробовал другие флаги, такие как «FLAG_ACTIVITY_NEW_TASK» и «FLAG_ACTIVITY_RESET_TASK_IF_NEEDED». ни то, ни другое здесь не работает.

person antonio081014    schedule 28.11.2012
comment
Я пробовал то же самое. Любая подсказка в документации, зачем нужен этот флаг? Он просто говорит, что если установлено, действие не будет запущено, если оно уже выполняется в верхней части стека истории. - person mparaz; 25.02.2013

Я работал с плагином локальных уведомлений для Unity, когда столкнулся с той же проблемой -> Я запустил приложение, запланировал локальное уведомление, отправил приложение в фоновый режим, появилось локальное уведомление и, когда я щелкнул по нему, приложение было возобновлено и getIntent().getExtras() было null.

В моем случае проблема заключалась в том, что я пытался получить дополнительные услуги с неправильным намерением. Попробуйте распечатать намерения с помощью простого toString в момент создания и когда вы его получите, чтобы убедиться, что полученное соответствует вашим ожиданиям.

Также обратите внимание на onNewIntent.

person jbourne    schedule 17.10.2017

Если вы используете неявное намерение для создания PendingIntent, вы можете столкнуться с этой проблемой.

предыдущий подход к проблеме.

val intent = Intent()
intent.action = Intent.ACTION_VIEW
intent.data = Uri.parse("deeplink or applink here")
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP)
intent.putExtra("key", Parcelable)
PendingIntent.getActivity(context, abs(Random.nextInt()), intent, PendingIntent.FLAG_UPDATE_CURRENT)

на основе неявного намерения пробовал несколько подходов, перечисленных выше, у меня не работает.


вот подход решил мою проблему. изменить намерение с неявного на явное.

// only diff
val intent = Intent(context, YourIntentDestinationActivity::class.java)
// only diff
intent.action = Intent.ACTION_VIEW
intent.data = Uri.parse("deeplink or applink here")
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP)
intent.putExtra("key", Parcelable)
PendingIntent.getActivity(context, abs(Random.nextInt()), intent, PendingIntent.FLAG_UPDATE_CURRENT)

Надеюсь, что это работает для вас.

person Jeffery Ma    schedule 26.07.2020