从通知接收 Intent 的 Receiver 问题

Problem with Receiver which receives Intents from Notification

我有一个向广播接收器发送广播的代码。

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

在另一个 class 我有一个 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"));

主要目的是达到以下结果:当用户点击通知中的上一首按钮时,将播放上一首歌曲。但是当我 运行 应用程序并选择音乐时,我无法像以前一样听音乐。所以,似乎某处有一个永久循环。怎么了?如果我只想播放之前的一首歌曲而不播放之前的所有歌曲,如何解决这个问题?

广播有系统广播和本地广播两种。

本地广播通过 LocalBroadcastManager 独家 运作。如果您看到与 "broadcast" 相关的任何其他内容,99.99% 的情况下,这是指系统广播。

特别是,PendingIntent.getBroadcast() 给你一个 PendingIntent 将发送系统广播。反过来,这意味着您的接收器需要设置为接收系统广播,原因可能是:

  • 它在清单中注册了一个 <receiver> 元素,或者
  • 它是通过在 Context 上调用 registerReceiver() 动态注册的(而不是在 LocalBroadcastManager 上)

请注意,在 Android 8.0+ 上,实际上禁止隐式广播(仅带有操作字符串的广播)。如果您选择在清单中注册接收者,请使用 Intent 标识特定接收者(例如 new Intent(this, MyReceiverClass.class))。如果您选择通过 registerReceiver() 注册您的接收器...我认为有一个方法可以解决这个问题,但我忘记了细节。