Намерение от уведомления не содержит дополнительных
Это, кажется, общая проблема, и я рассмотрел все связанные с этим вопросы, которые я мог найти:
Активность не набирает новые цели, Почему дополнительные данные (целое число) не отправляются в намерениях андроидного уведомления?, Уведомление передает старые предикаты Intent, Невозможно добавить дополнительные уведомления для уведомления, проблема уведомления об ожидающем намерении Android; но все еще не может понять этого.
Проблема такая же. Я установил уведомление с PendingIntent с дополнительной информацией, и я не получаю его с другой стороны.
Вот код для генерации уведомления:
Notification notification = new Notification(R.drawable.icon, getResources().getString(R.string.notification_ticker), System.currentTimeMillis());
notification.flags = Notification.FLAG_AUTO_CANCEL | Notification.FLAG_ONLY_ALERT_ONCE;
Intent start_test = new Intent(this, MyActivity.class);
start_test.putExtra("start_test", true);
start_test.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent pi = PendingIntent.getActivity(this, (int) System.currentTimeMillis(), start_test, PendingIntent.FLAG_CANCEL_CURRENT);
notification.setLatestEventInfo(this, getResources().getString(R.string.notification_title), getResources().getString(R.string.notification_content, expired), pi);
nm.notify(NOTIFICATION_ID, notification);
И с другой стороны:
boolean start_test=getIntent().getBooleanExtra("start_test", false);
На самом деле пакет не существует (getExtras() возвращает null).
Я пробовал разные флаги для PendingIntent.getActivity
(FLAG_UPDATE_CURRENT
, FLAG_CANCEL_CURRENT
, FLAG_ONE_SHOT
), ни одна из них не помогла.
Как показано в коде, я использую getCurrentMillis, чтобы убедиться, что идентификатор запроса изменился....
Также найдено, что в MyActivity не вызываются вызовы onCreate
и onNewIntent
. только onResume
есть. Даже если FLAG_ACTIVITY_NEW_TASK
установлен...?
Я пропустил что-то очень простое?
Ответы
Ответ 1
Настройка FLAG_ACTIVITY_NEW_TASK
для уведомления Intent приведет к следующему:
-
Если действие не уже запущено в задаче, будет запущена новая задача, и намерение будет передано в действие в onCreate()
-
Однако, если активность уже запущена в задаче, эта задача будет перенесена на передний план. Все это. Намерение будет не доставлено и onNewIntent()
не будет вызываться.
Если вы хотите, чтобы намерение действительно было доставлено, вам нужно указать:
start_test.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
Intent.FLAG_ACTIVITY_SINGLE_TOP);
Он делает без разницы, является ли launchMode
активности singleTop
или нет, вы все равно должны указать Intent.FLAG_ACTIVITY_SINGLE_TOP
в намерении.
Примечание. Если активность уже запущена в задаче, а ее активность не поверх стека действий в этой задаче, задача будет перенесена в на переднем плане. Все это. Намерение будет не. Единственный способ сделать это - добавить Intent.FLAG_ACTIVITY_CLEAR_TOP
в другие 2 флага, но это может быть не то, что вы хотите (зависит от вашего конкретного сценария).
См. мою (пока) открытую проблему в коде Google http://code.google.com/p/android/issues/detail?id=17137
Ответ 2
Я добавил флаг PendingIntent.FLAG_UPDATE_CURRENT
к моему ожидающему намерению, и он начал работать для меня (пропустил все флаги для Intent).
Пример кода:
PendingIntent pendIntent = PendingIntent.getActivity(getApplicationContext(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
Ответ 3
-
Если не требуется, избегать, чтобы ваша активность была манифестной как одна задача. опустите эту строку или измените ее на singleTop, если вы можете:
android:launchMode="singleTask"
-
Если у вас должна быть одна задача, то в ожидающих намерения установить флаги:
Намерение. FLAG_ACTIVITY_NEW_TASK | Намерение. FLAG_ACTIVITY_CLEAR_TASK
И PendingIntent. FLAG_CANCEL_CURRENT.
resultIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |Intent.FLAG_ACTIVITY_CLEAR_TASK);
pIntent = PendingIntent.getActivity(context, 0, resultIntent, PendingIntent.FLAG_CANCEL_CURRENT );
-
Если у вас есть одна задача - Reset ваши дополнительные функции в вашей деятельности внутри onNewIntent() с помощью setIntent (намерение);
protected void onNewIntent(Intent intent) {
setIntent(intent);
...
}
Ответ 4
Упрощенный подход: реальная проблема заключается в том, что намерение, находящееся на одной и той же цели, заменяется. Я решил это, только что создав новую услугу - "NotificationDismissalService". Единственное, что касается этой услуги, - это элемент setDeleteIntent. Поскольку это уникальная услуга, параметры не заменяются. Тело NotificationDismissalService (и это действительно будет одна такая служба увольнения за уникальный тип намерения) - это простая реализация "onStartCommand", которая отправляет намерение на предпочтительный сервис (чтение/запись правильных параметров). Поскольку это фактическая отправка службы, без промежуточного ответа между ними, она работает нормально.
Ответ 5
Вы можете отправить дополнительные услуги в соответствии с следующим образом.
PendingIntent contentIntent ;
Intent intent = new Intent(this,TestActivity.class);
intent.putExtra("extra","Test");
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
stackBuilder.addParentStack(ArticleDetailedActivity.class);
contentIntent = stackBuilder.getPendingIntent(0,PendingIntent.FLAG_UPDATE_CURRENT);
Чтобы получить дополнительное значение в классе Test Activity, вам необходимо написать следующий код:
Intent intent = getIntent();
String extra = intent.getStringExtra("extra") ;
Ответ 6
Я использовал что-то вроде этого
Intent myIntent = new Intent(context, DoSomething.class);
PendingIntent pendingIntent = PendingIntent.getActivity(
context,
0,
myIntent,
Intent.FLAG_ACTIVITY_NEW_TASK);
Посмотрите полный пример здесь