GetIntent() Дополнительно всегда NULL
Я написал простое приложение для 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.
Ответы
Ответ 1
Это сценарий:
Метод getIntent()
возвращает FIRST, чем запуск.
Итак, когда действие ЗАКРЫТО (завершено), и пользователь нажимает на уведомление, он будет запускать новый экземпляр активности, а getIntent()
работает как ожидалось (Extras не null
).
Но если действие "спящее" (оно находится в фоновом режиме), и пользователь нажимает на уведомление, getIntent()
всегда возвращает самое ПЕРВЫЙ намерение, которое запустило действие, а НЕ - намерение уведомления.
Итак, чтобы поймать намерение уведомления во время работы приложения, просто используйте этот
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
а затем переопределить onNewIntent(Intent newintent)
.
Итак, когда приложение запускается, getIntent()
может использоваться и когда приложение возобновляется со спящего режима, onNewIntent
работает.
Ответ 2
Просто напишите этот код над вашим методом Resume(). Это все, что нужно. Это освежает намерение - я действительно не знаю, но оно работает.
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
}
Ответ 3
Проблема: Вы отправляете тот же код запроса для ожидающей интенсивности. Измени это.
Решение: установите глобальную переменную int UNIQUE_INT_PER_CALL = 0 и при создании вызова pendingIntent, как показано ниже.
PendingIntent contentIntent = PendingIntent.getActivity(context, UNIQUE_INT_PER_CALL, notificationIntent, 0);
UNIQUE_INT_PER_CALL++; // to increment.
Ответ 4
Так как кажется, что ваша активность уже запущена, я думаю, вам нужно указать FLAG_UPDATE_CURRENT
, иначе вызов getIntent()
вернет предыдущий. См. этот ответ.
Ответ 5
Посмотрите Общие настройки для передачи и поиска постоянных пар ключ/значение.