始终在API 26中运行广播接收器

时间:2017-11-21 09:25:12

标签: android broadcastreceiver android-broadcastreceiver android-8.0-oreo

我在API 26上实现一直运行的广播接收器时遇到了一些问题。 首先,我的意图过滤器不在Oreo无限制的白名单 - 意图过滤器上。 我尝试将我的广播接收器包装在NotificationListenerService中,但是一段时间后它就会被杀死。 此外,我不想让前台服务通知显示。 如果我将TargetSDK降级到API 25,Oreo设备上的这些限制将无法启用? 谢谢:))

2 个答案:

答案 0 :(得分:0)

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