getIntent () Дополнения всегда NULL - PullRequest
74 голосов
/ 15 июня 2011

Я написал простое приложение для 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();

но дополнения всегда NULL!

Я пробовал любую комбинацию:

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

или

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

но getIntent (). GetExtras () всегда возвращает NULL.

Ответы [ 5 ]

113 голосов
/ 15 июня 2011

Это сценарий:
Метод getIntent() возвращает ПЕРВОЕ намерение, чем действие запуска.

Таким образом, когда действие ЗАКРЫТО (прекращено) и пользователь нажимает на уведомление, оно запускает новый экземпляр действия, и getIntent() работает, как ожидается (Доп. Значение не null ).

Но если действие «спит» (оно находится в фоновом режиме) и пользователь нажимает на уведомление, getIntent() всегда возвращает ПЕРВОЕ намерение, с которого началось действие, а НЕ уведомление.

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

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

и затем переопределить onNewIntent(Intent newintent).

Таким образом, при первом запуске приложения можно использовать getIntent(), а когда приложение возобновляется из спящего режима, onNewIntent работает.

90 голосов
/ 12 января 2013

Просто напишите этот код над вашим именем поверх метода Resume ().Это все, что нужно.Это обновляет намерение - я действительно не знаю, но это работает.

15 голосов
/ 09 мая 2013

Проблема: Вы отправляете тот же код запроса для ожидающей интенсивности.Измените это.

Решение : Установите глобальную переменную int UNIQUE_INT_PER_CALL = 0 и при создании вызова pendingIntent, как показано ниже.

 PendingIntent contentIntent = PendingIntent.getActivity(context, UNIQUE_INT_PER_CALL, notificationIntent, 0);

UNIQUE_INT_PER_CALL ++;// для увеличения.

3 голосов
/ 15 июня 2011

Поскольку кажется, что ваша активность уже запущена, я думаю, вам нужно указать FLAG_UPDATE_CURRENT, в противном случае вызов getIntent() вернет предыдущий.См. этот ответ .

0 голосов
/ 15 июня 2011

Посмотрите на Общие настройки для передачи и извлечения постоянных пар ключ / значение.

...