为Oreo禁用BroadcastReceiver?

时间:2018-05-15 08:27:51

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

我的应用程序的清单文件中注册了一个接收器,其行为为BOOT_COMPLETED。 我的应用程序中有第三方库,当它收到BOOT_COMPLETED操作时,它会启动一个服务。由于Android Oreo中存在后台执行限制,因此崩溃。

现在,我想仅针对Android O设备禁用此接收器。有没有办法做到这一点?也许就像@TargetApi但在Android Manifest中?

我忘记写道我无法更改库类,它是一个外部jar文件。

2 个答案:

答案 0 :(得分:0)

由于图书馆的代码不在您的控制之下,任何方法都无法运作。您应该要求图书馆提供商遵守最新的操作系统。

您可以尝试以下方法:

  • 在您的应用中以高优先级注册BOOT_COMPLETED,如下所示:

    <action android:name="android.intent.action.BOOT_COMPLETED" android:priority="999"/>

  • 立即启动前台服务

可能允许您的图书馆启动后台服务。

或者,如果您可以访问库的BootReceiver类,则可以按如下方式禁用它:

PackageManager pm = getPackageManager();
ComponentName compName = 
      new ComponentName(getApplicationContext(), 
            <library_broadcastreceiver>.class);
pm.setComponentEnabledSetting(
      compName,
      PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 
      PackageManager.DONT_KILL_APP);

答案 1 :(得分:0)

现在回答答案为时已晚,但也许会对某人有所帮助。 我找到了不同的解决方案,例如可以在接受的答案中将接收方注册到清单中,但是可以代替priority来指定tools:node="remove",并且此属性将从结果清单中删除。另外,我认为可以为Android O创建单独的清单。

<receiver android:name="com.package.app.SomeReceiver">
     <intent-filter>
           <action android:name="android.intent.action.BOOT_COMPLETED"  tools:node="remove"/>
     </intent-filter>
</receiver>