我有一个将广播发送到广播接收器的代码。
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"));
主要目的是达到以下结果:当用户单击通知中的上一步按钮时,将播放上一首歌曲。但是,当我运行该应用程序并选择音乐时,就像以前的播放一样,我无法听音乐。因此,似乎某个地方存在永久循环。怎么了?如果我只想播放一首以前的歌曲而不想播放所有先前的歌曲,该如何解决这个问题?
答案 0 :(得分:1)
广播有两种类型:系统广播和本地广播。
本地广播通过LocalBroadcastManager
专有地进行。如果您发现还有99.99%的时间与“广播”相关的其他内容,则是指系统广播。
尤其是,PendingIntent.getBroadcast()
为您提供了PendingIntent
,它将发送系统广播。反过来,这意味着您的接收器需要设置为接收系统广播,原因如下:
<receiver>
元素,或者registerReceiver()
(而不是Context
)上调用LocalBroadcastManager
动态注册它请注意,在Android 8.0+上,实际上禁止了隐式广播(仅带有操作字符串的广播)。如果您选择在清单中注册接收者,请使用标识特定接收者的Intent
(例如new Intent(this, MyReceiverClass.class)
)。如果您选择通过registerReceiver()
注册接收者...我认为有一个处理该问题的方法,但是我忘记了细节。