it-roy-ru.com

Намерение от уведомления не имеет дополнений

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

Я пробовал разные флаги для PendingIntent.getActivity (FLAG_UPDATE_CURRENT, FLAG_CANCEL_CURRENT, FLAG_ONE_SHOT), ни один из них не помог.

Как показано в коде, я использую getCurrentMillis, чтобы убедиться, что requestID изменяется ....

Также обнаружено, что в MyActivity onCreate и onNewIntent не вызываются. только onResume есть. Даже если FLAG_ACTIVITY_NEW_TASK установлен ...?

Я что-то упускаю очень просто?

38
Matthieu

Установка FLAG_ACTIVITY_NEW_TASK для намерения уведомления приведет к следующему:

  • Если действие не уже выполняется в задаче, будет запущена новая задача, и Намерение будет доставлено в действие в onCreate()

  • Однако, если действие уже выполняется в задаче, эта задача будет выведена на передний план. Это все. Намерение будет не доставлено и onNewIntent() не будет вызвано.

Если вы хотите, чтобы Intent фактически был доставлен, вам нужно указать:

start_test.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | 
                    Intent.FLAG_ACTIVITY_SINGLE_TOP);

Это не делает без разницы, является ли launchMode действия singleTop или нет, вы все равно должны указать Intent.FLAG_ACTIVITY_SINGLE_TOP в Намерении.

Примечание: Если действие уже выполняется в задаче и действие not находится над стеком действия в этой задаче, задача будет выведена на передний план. Это все. Намерение будет не доставлено. Единственный способ сделать это состоит в том, чтобы добавить Intent.FLAG_ACTIVITY_CLEAR_TOP к двум другим флагам, но это может быть не тем, что вам нужно (зависит от вашего конкретного сценария).

Смотрите мою (все еще) открытую проблему в коде Google по адресу http://code.google.com/p/Android/issues/detail?id=17137

46
David Wasser

Я просто добавил флаг PendingIntent.FLAG_UPDATE_CURRENT к своему ожидаемому намерению, и он начал работать для меня (пропустил все флаги для Intent).

Пример кода:

PendingIntent pendIntent = PendingIntent.getActivity(getApplicationContext(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
34
codingjeremy
  1. Если не нужно, то избегайте настройте свою активность в манифесте как одну задачу. пропустите эту строку или измените ее на singleTop, если можете:

      Android:launchMode="singleTask”
    
  2. Если у вас должна быть одна задача, то в состоянии ожидания установите флаги: Intent. FLAG_ACTIVITY_NEW_TASK | Intent. 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 );
    
  3. Если у вас есть одна задача - Сбросьте свои дополнения в своей деятельности внутри onNewIntent () с помощью setIntent (intent);

    protected void onNewIntent(Intent intent) {
           setIntent(intent);
           ... 
     }
    
4
Udi Reshef

Более простой подход: настоящая проблема заключается в том, что Намерение, находящееся на одной цели, заменяется. Я решил это, только что создал новый сервис, "NotificationDismissalService". Единственное намерение, направленное к этому сервису - это элемент setDeleteIntent. Поскольку это уникальный сервис, параметры не заменяются. Тело NotificationDismissalService (и на самом деле это будет одна такая служба отклонения для каждого типа уникального намерения) представляет собой простую реализацию «onStartCommand», которая отправляет намерение предпочтительному сервису (чтение/запись правильных параметров). Поскольку это фактическая отправка службы без промежуточного ожидания, она работает просто отлично.

0
user1676075

Я использовал что-то вроде этого 

Intent myIntent = new Intent(context, DoSomething.class);
 PendingIntent pendingIntent = PendingIntent.getActivity(
        context, 
        0, 
        myIntent, 
        Intent.FLAG_ACTIVITY_NEW_TASK);

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

0
Panayiotis Georgiou

Вы можете отправить статистику следующим образом

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);

Чтобы получить дополнительное значение Intent в классе Test Activity, вам нужно написать следующий код:

Intent intent = getIntent();
 String extra = intent.getStringExtra("extra") ;
0
mohit