PendingIntent.getBroadcast предупреждение о ворсе

#android #broadcastreceiver #android-notifications #android-pendingintent

Вопрос:

Появилось это новое предупреждение об использовании PendingIntent.getBroadcast в качестве цели содержимого уведомления:

 builder.setContentIntent(PendingIntent.getBroadcast(FirebaseNotification.this, newID,
                                                  new Intent(getString(R.string.notif_broadcast))
                                                          .setClass(FirebaseNotification.this, NotificationActions.class)
                                                          .putExtra(getString(R.string.thumbnail), bitmap);
 

Сообщение о ворсе:

Уведомления должны запускать только приемник широковещательной передачи из действий с уведомлениями (addAction)

Уведомления должны запускать получателя широковещательной передачи только из действий уведомления (addAction) (это намерение получателя широковещательной передачи запускается из уведомления; это не рекомендуется, за исключением действий уведомления)

Я еще нигде не вижу этого в документации, так почему же это сейчас обескураживает? Это для удобства пользователя и для обеспечения четкого контекста того, что может сделать уведомление?

Ответ №1:

Для пользователя не имело бы особого смысла, если бы нажатие на уведомление отправляло широковещательную передачу. Ожидаемое поведение будет заключаться в том, чтобы открыть фактическое приложение, которое первоначально отправило уведомление, поэтому я не уверен, что отправка другого уведомления (я предполагаю, что это то, чего достигает ваш код) будет хорошим UX.

Они действительно упоминают, что это документация по проектированию материалов, в которой говорится:

Когда пользователь нажимает на уведомление, они должны быть перенесены на экран в вашем приложении, который напрямую связан с этим уведомлением и позволяет им немедленно предпринять действия.

Комментарии:

1. То, что я обычно замечаю в других приложениях, — это нажатие на уведомление, например, приложение FB, откроет соответствующий экран, который относится к тому, что указано в заголовке или описании уведомления, и именно это я делаю с использованием getBroadcast , чтобы открыть какое-либо действие, используя путь к пакету.

2. Кажется странным делать это, когда вы могли бы просто использовать обычное намерение для запуска своего приложения с аргументами/дополнениями. Затем вы можете использовать их для отображения соответствующего пользовательского интерфейса. Я не думаю, что метод, который вы описываете, является очень стандартным, хотя он выполнил бы задачу, поэтому, если вам нужно его использовать, я бы проигнорировал предупреждение.

3. setContentIntent требуется PendingIntent, и я не хочу открывать какие-либо действия только тогда, когда приложение получило уведомление из ниоткуда, поэтому я не могу сказать, что достаточно использовать обычное намерение. Может быть, я просто буду использовать его с добавлением, так как это удаляет предупреждение о ворсе.

4. Да, вы бы использовали a PendingIntent с помощью этого PendingIntent.getActivity(...) метода. Очевидно, вам не нужно следовать рекомендациям, иначе вы могли бы использовать действие, как вы сказали.

5. Я просто вспоминаю, что NotificationAction.class вот приемник широковещательной передачи, используемый для обработки многих запросов или типов уведомлений, и я технически не открываю действие с помощью приведенного выше кода. Что происходит внутри этого приемника вещания, так это открытие плавающего экрана, похожего на головку чата.