接收方从通知接收意图的问题

时间:2019-02-03 15:27:00

标签: java android android-broadcast

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

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 :(得分:1)

广播有两种类型:系统广播和本地广播。

本地广播通过LocalBroadcastManager 专有地进行。如果您发现还有99.99%的时间与“广播”相关的其他内容,则是指系统广播。

尤其是,PendingIntent.getBroadcast()为您提供了PendingIntent,它将发送系统广播。反过来,这意味着您的接收器需要设置为接收系统广播,原因如下:

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

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