为 Oreo 禁用 BroadcastReceiver?
Disabling BroadcastReceiver for Oreo?
我在我的应用程序的清单文件中注册了一个接收器,其操作为 BOOT_COMPLETED。
我的应用程序中有一个第三方库,当它收到 BOOT_COMPLETED 操作时,它会启动一个服务。由于 Android Oreo 中存在后台执行限制,因此它崩溃了。
现在,我只想为 Android O 台设备禁用此接收器。有没有办法做到这一点?也许就像@TargetApi 但在 Android Manifest?
我忘了写我不能更改库 class,它是一个外部 jar 文件。
由于库的代码不在您的控制范围内,任何方法都行不通。您应该要求图书馆提供者遵守最新的 OS.
您可以尝试以下解决方法:
在您的应用中以高优先级注册BOOT_COMPLETED
,如下所示:
<action android:name="android.intent.action.BOOT_COMPLETED" android:priority="999"/>
立即启动前台服务
这可能允许您的图书馆启动后台服务。
或者,如果您有权访问库的 BootReceiver class,您可以按如下方式禁用它:
PackageManager pm = getPackageManager();
ComponentName compName =
new ComponentName(getApplicationContext(),
<library_broadcastreceiver>.class);
pm.setComponentEnabledSetting(
compName,
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP);
现在回答为时已晚,但也许它会对某人有所帮助。
我找到了不同的解决方案,就像在接受的答案中一样,您可以在清单中注册接收器,但是您可以指定 tools:node="remove"
而不是 priority
并且此属性将从结果清单中删除。另外我认为可以为 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>
我在我的应用程序的清单文件中注册了一个接收器,其操作为 BOOT_COMPLETED。 我的应用程序中有一个第三方库,当它收到 BOOT_COMPLETED 操作时,它会启动一个服务。由于 Android Oreo 中存在后台执行限制,因此它崩溃了。
现在,我只想为 Android O 台设备禁用此接收器。有没有办法做到这一点?也许就像@TargetApi 但在 Android Manifest?
我忘了写我不能更改库 class,它是一个外部 jar 文件。
由于库的代码不在您的控制范围内,任何方法都行不通。您应该要求图书馆提供者遵守最新的 OS.
您可以尝试以下解决方法:
在您的应用中以高优先级注册
BOOT_COMPLETED
,如下所示:<action android:name="android.intent.action.BOOT_COMPLETED" android:priority="999"/>
立即启动前台服务
这可能允许您的图书馆启动后台服务。
或者,如果您有权访问库的 BootReceiver class,您可以按如下方式禁用它:
PackageManager pm = getPackageManager();
ComponentName compName =
new ComponentName(getApplicationContext(),
<library_broadcastreceiver>.class);
pm.setComponentEnabledSetting(
compName,
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP);
现在回答为时已晚,但也许它会对某人有所帮助。
我找到了不同的解决方案,就像在接受的答案中一样,您可以在清单中注册接收器,但是您可以指定 tools:node="remove"
而不是 priority
并且此属性将从结果清单中删除。另外我认为可以为 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>