Проблема с получателем, который получает содержание из уведомления - PullRequest
0 голосов
/ 03 февраля 2019

У меня есть код, который отправляет трансляцию на приемник трансляции.

Intent intentPrev = new Intent(ACTION_PREV);
        PendingIntent pendingIntentPrev = PendingIntent.getBroadcast(this, 0, intentPrev, PendingIntent.FLAG_UPDATE_CURRENT);
        LocalBroadcastManager.getInstance(this).sendBroadcast(intentPrev);
        NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        notificationManager.notify(1, notification);

В другом классе у меня есть Receiver:

private BroadcastReceiver NotificationReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().equals("PREVIOUS")){
                playPrev();
            }
        }
    };

И в onCreate метод я регистрирую этот получатель:

LocalBroadcastManager.getInstance(this).registerReceiver(NotificationReceiver, new IntentFilter("PREVIOUS"));

Основнойцель заключалась в достижении следующего результата: когда пользователь нажимает кнопку «Предыдущий» в уведомлении, воспроизводится предыдущая песня.Но когда я запускаю приложение и выбираю музыку, я не могу слушать музыку, как всегда играет предыдущая.Итак, кажется, что где-то есть вечная петля.В чем дело?Как решить эту проблему, если я хочу воспроизвести только одну предыдущую песню, но не все предыдущие песни?

1 Ответ

0 голосов
/ 05 февраля 2019

Существует два типа трансляций: системные трансляции и локальные трансляции.

Локальные трансляции работают через LocalBroadcastManager исключительно .Если вы видите что-то еще, связанное с «широковещанием», в 99,99% случаев это относится к системным трансляциям.

В частности, PendingIntent.getBroadcast() дает вам PendingIntent, который будет отправлять системную трансляцию.Это, в свою очередь, означает, что ваш приемник должен быть настроен на прием системного вещания, потому что:

  • Он зарегистрирован в манифесте с элементом <receiver>, или
  • Он регистрируется динамически, вызывая registerReceiver() на Context (не на LocalBroadcastManager)

Обратите внимание, что на Android 8.0+ неявные трансляции (те, которые содержат только строку действия)забанен, по сути.Если вы решите зарегистрировать свой получатель в манифесте, используйте Intent, который идентифицирует конкретного получателя (например, new Intent(this, MyReceiverClass.class)).Если вы решите зарегистрировать свой приемник через registerReceiver() ... Я думаю, что есть рецепт, как справиться с этим, но я забываю детали.

...