从通知接收 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()
注册您的接收器...我认为有一个方法可以解决这个问题,但我忘记了细节。
我有一个向广播接收器发送广播的代码。
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()
注册您的接收器...我认为有一个方法可以解决这个问题,但我忘记了细节。