getIntent () Додатки завжди NULL


77

Я написав простий додаток для Android, який показує власне сповіщення, подібне до цього:

Context context = getApplicationContext();          
NotificationManager manager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
Notification notification = new Notification( R.drawable.icon, title, System.currentTimeMillis());  
Intent notificationIntent = new Intent( context,  this.getClass()); 
notificationIntent.putExtra("com.mysecure.lastpage", "SECURECODE"); 
PendingIntent pendingIntent = PendingIntent.getActivity( context , 0, notificationIntent, 0);               
notification.flags = notification.flags | Notification.FLAG_ONGOING_EVENT;
notification.contentView = new RemoteViews(context.getPackageName(), R.layout.notifypbar);
notification.contentIntent = pendingIntent;

notification.contentView.setTextViewText(R.id.notifypb_status_text, text);
notification.contentView.setProgressBar(R.id.notifypb_status_progress, 100, (int)(100*progress), false);

manager.notify(104, notification);

Цей фрагмент коду називається ТІЛЬКИ РОДИНО в моєму додатку, і він відображає сповіщення з індикатором виконання (все правильно).

Тепер, коли користувач натискає це повідомлення, моя програма обробляє onResumeподію.

public void onResume()
{
    super.onResume();
    // TODO: Extras è SEMPRE NULL!!! impossibile!
    Intent callingintent = getIntent(); 
    Bundle extras = callingintent.getExtras();

але додаткові послуги завжди НУЛЬ!

Я спробував будь-яку комбінацію:

notificationIntent.putExtra("com.mysecure.lastpage", "SECURECODE");

або

Bundle extra = new Bundle();
extra.putString(key, value);
notificationIntent.putExtra(extra);

але getIntent (). getExtras () завжди повертає NULL.


Ви намагалися встановити контекст програми в межах Повідомлення?
apesa

Відповіді:


118

Це сценарій:
метод getIntent()повертає ПЕРШИЙ намір, ніж активність запуску.

Отже, коли активність ЗАКРИТЬ (припинена) і користувач натискає на сповіщення, він запускає новий екземпляр діяльності та getIntent()працює, як очікувалось (Додатково - ні null ).

Але якщо діяльність "спляча" (вона знаходиться у фоновому режимі), і користувач натискає на сповіщення, getIntent()завжди повертає той самий ПЕРШИЙ намір, який розпочав діяльність, а НЕ намір сповіщення.

Отже, щоб зрозуміти намір сповіщення під час запуску програми, просто використовуйте це

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

а потім відмінити onNewIntent(Intent newintent).

Отже, коли програма запускається вперше, getIntent()її можна використовувати, а коли програму відновлено з режиму сну, це onNewIntentпрацює.


44
У мене працювало: PendingIntent pendingIntent = PendingIntent.getActivity (context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
user672009

3
awsme відповідь .. Я витрачаю багато часу на налагодження цієї проблеми. Дуже дякую.
Діпак

у моєму випадку додайте більше android: launchMode = "singleTask" в активність запуску. Дякую!
Куонг Нгуєн

98

Просто напишіть цей код над вашим поверх вашого методу Resume (). Це все, що потрібно. Це освіжає наміри - я насправді не знаю, але це працює.

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

1
це рішення працювало для мене під час діяльності, не перевіреної в експлуатації.
coolcool1994

2
Ви рятувальник життя!
Фарук Тоузі

3
Збережіть мій день через 2 дні :))))

20

Проблема: Ви надсилаєте той самий код запиту для очікуваних інтенсивностей. Змініть це.

Рішення : Встановіть глобальну змінну int UNIQUE_INT_PER_CALL = 0 і при створенні виклику pendingIntent, як показано нижче.

PendingIntent contentIntent = PendingIntent.getActivity(context, UNIQUE_INT_PER_CALL, notificationIntent, 0);
UNIQUE_INT_PER_CALL++; // to increment.

1
Це спрацювало для мене. Я використав цеint notificationId = new Random().nextInt();
Йонас Борггрен

Гаразд, це вирішує моє питання, чи не могли б Ви пояснити, чому це важливо? У моєму випадку я просто посилаю один намір.
желефікація

3

Оскільки, здається, ваша активність уже запущена, я думаю, вам потрібно вказати FLAG_UPDATE_CURRENT, інакше getIntent()дзвінок поверне попередній. Дивіться цю відповідь .


Однак у моїй заявці не було наміру "ПОПЕРЕДНІЙ". Цей фрагмент коду буде називатися ТОЛЬКО, і жоден інший намір не буде створений або оновлений після цього.
Magius

Усі заходи починаються за намірами, тому має бути попередній намір. Ха, я щойно побачив вашу власну відповідь, ось що я мав на увазі!
дмон

1
Це те, що вирішило для мене. ось де встановити цей прапор: developer.android.com/reference/android/app/…
finiteloop

-9

Перегляньте Спільні налаштування для передачі та отримання стійких пар ключ / значення.


мені не потрібно зберігати дані в налаштуваннях. Я використовую спільні уподобання для інших цілей. Мені потрібно пройти ExtraData через намір.
Magius
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.