Я пытаюсь создать уведомление во время работы службы воспроизведения музыки и использовать уведомление для взаимодействия с сервисом (воспроизведение, пауза, остановка) с использованием механизма Broadcast.Передача по уведомлению Действие, которое не обрабатывается в BroadcastReceiver внутри службы
(Я знаю, что есть возможность использовать PendingIntent.getService() в качестве кнопки действия в уведомлении, но мне не нравится эта идея, потому что это вызовет onStartCommand() службы, и я необходимо проанализировать и проанализировать объект Intent для принятия мер, что кажется не таким чистым, как подход BroadcastReceiver, описанный ниже).
Давайте проиллюстрируем то, что у нас есть до сих пор с некоторым (усеченным) кодом.
Мы создания объекта Notification внутри жизненного цикла сервиса, добавьте кнопку действия, и показывать уведомления с помощью
startForeground()
.... Intent i = new Intent(getBaseContext(), PlayerService.class); PendingIntent piStop = PendingIntent.getBroadcast(getBaseContext(), 1, i, PendingIntent.FLAG_ONE_SHOT); NotificationCompat.Action actionStopPlayback = new NotificationCompat.Action(R.drawable.ic_stop_white_36dp, "Stop playback", piStop); notification.addAction(actionStopPlayback); ...
Тогда мы регистрации BroadcastReceiver внутри OnCreate() службы (и регистрацией его в OnDestroy конечно, это более простой пример).
IntentFilter intentFilter = new IntentFilter(); registerReceiver(new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { Log.d(getClass().toString(), "Broadcast received"); } }, intentFilter);
И конечный результат в том, что OnReceive() приемника никогда не вызывается. Услуга является непрерывной и активна, когда действие «Уведомление» отправляет широковещательную передачу. Поскольку у меня нет возможности отлаживать трансляции из-за их характера, я как бы заблокирован здесь.
Я использовал механизм, в котором Уведомление отправляет широковещательную передачу в BroadcastReceiver «A». Этот BroadcastReceiver «A» отправляет трансляцию во внутреннюю (внутреннюю службу) BroadcastReceiver «B». В B onReceive() я обрабатываю задачу. Вот [пример github repo] (https://github.com/rupinderjeet/NotificationActionButtonExample/tree/master/app/src/main/java/com/rupinderjeet/notificationactionbuttonexample) Я сделал для другого ответа. ** См. Ответ Майка **. – rupinderjeet