Подтвердить что ты не робот

Намерение от уведомления не содержит дополнительных

Это, кажется, общая проблема, и я рассмотрел все связанные с этим вопросы, которые я мог найти: Активность не набирает новые цели, Почему дополнительные данные (целое число) не отправляются в намерениях андроидного уведомления?, Уведомление передает старые предикаты 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 установлен...?

Я пропустил что-то очень простое?

4b9b3361

Ответ 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);

Посмотрите полный пример здесь