我在API 26上实现一直运行的广播接收器时遇到了一些问题。 首先,我的意图过滤器不在Oreo无限制的白名单 - 意图过滤器上。 我尝试将我的广播接收器包装在NotificationListenerService中,但是一段时间后它就会被杀死。 此外,我不想让前台服务通知显示。 如果我将TargetSDK降级到API 25,Oreo设备上的这些限制将无法启用? 谢谢:))
答案 0 :(得分:0)
BroadcastReceiver
有limited time来处理传入的广播:
系统允许超时10秒 考虑接收器被阻挡和候选人被杀
如果通过"始终运行"你实际上意味着"隐式注册",如同一个总是注册的广播,即使应用程序没有运行,那么你可以将你的targetSDK设置为不是24或更低的目标,它应该没问题,除非Oreo用户进入设置,并对您的应用强制执行新的限制。
来自docs:
应用无法使用其清单注册最隐含的内容 广播
...
默认情况下,这些限制仅适用于那些应用 目标O.但是,用户可以为任何应用程序启用这些限制 在“设置”屏幕中,即使应用程序未定位O.
答案 1 :(得分:0)
如果可以提供帮助,此解决方案对我有用(如果您的广播接收器已在您的应用或其他应用的清单中注册):
PackageManager pm=getPackageManager();
List<ResolveInfo> matches=pm.queryBroadcastReceivers(yourIntent, 0);
for (ResolveInfo resolveInfo : matches) {
Intent explicit=new Intent(yourIntent);
ComponentName cn= new ComponentName(resolveInfo.activityInfo.applicationInfo.packageName,
resolveInfo.activityInfo.name);
explicit.setComponent(cn);
sendBroadcast(explicit);
}