#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 вот приемник широковещательной передачи, используемый для обработки многих запросов или типов уведомлений, и я технически не открываю действие с помощью приведенного выше кода. Что происходит внутри этого приемника вещания, так это открытие плавающего экрана, похожего на головку чата.