当前位置: 首页 > 知识库问答 >
问题:

不允许后台执行,接收意图BOOT_COMPLETED

司英飙
2023-03-14

我读过关于Android Oreo后台执行限制的文章,它明确指出boot_completed广播不受影响,但我无法让它在Android Oreo上工作。

首先,我是在SDK27上编译的。其次,我在清单文件中声明了接收者:

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
    <receiver
        android:name="helpers.StartDetectionAtBoot"
        android:label="StartDetectionAtBoot"
        android:enabled="true"
        android:exported="true">
        <intent-filter>
            <category android:name="android.intent.category.DEFAULT"/>

            <action android:name="android.intent.action.MY_PACKAGE_REPLACED"/>

            <action android:name="android.intent.action.BOOT_COMPLETED"/>
            <action android:name="android.intent.action.QUICKBOOT_POWERON"/>
            <!--For HTC devices-->
            <action android:name="com.htc.intent.action.QUICKBOOT_POWERON"/>
            <!--For MIUI devices-->
            <action android:name="android.intent.action.REBOOT"/>
        </intent-filter>
    </receiver>

然后是接收器的实现,也可以简单到:

public class StartDetectionAtBoot extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i("test", "test");

        Intent intent0 = new Intent( context, ActivityRecognitionService.class );
        PendingIntent pendingIntent = PendingIntent.getService(context, 111, intent0, PendingIntent.FLAG_UPDATE_CURRENT);
        ActivityRecognitionClient activityRecognitionClient = ActivityRecognition.getClient(context);
        activityRecognitionClient.requestActivityUpdates(5000, pendingIntent);
    }
}

在运行时注册广播意图,让它工作(在模拟器上,从adb shell激发意图),但我不确定这是否是正确的方法:

registerReceiver(new StartDetectionAtBoot(), new IntentFilter(Intent.ACTION_BOOT_COMPLETED));

这个有什么已知的bug吗?

共有1个答案

松新
2023-03-14

在代码中自我注册所需的隐含意图是开始接收意图的正确方法。对此不需要任何服务(在大多数情况下,请参见下文...)。但是您需要注意以下几点,以便在测试期间不会混淆,也不会破坏早期的实现:

  1. 每个应用程序运行应该进行一次自注册。根据Java/Kotlin应用程序数据:每个静态字段生命周期一次。因此,一个静态布尔字段应该可以让你知道:如果你需要自注册(例如,在重启后或Android系统稍后关闭了你的应用程序后...)或者不是(我引用此提交的工作代码:https://github.com/andstatus/todoAgenda/commit/74ffc1495f2c4bebe5c43aab13389ea0ea821fde):
    private static volatile boolean receiversRegistered = false;

    private static void registerReceivers(Context contextIn) {
        if (receiversRegistered) return;

        Context context = contextIn.getApplicationContext();
        EnvironmentChangedReceiver receiver = new EnvironmentChangedReceiver();

        IntentFilter providerChanged = new IntentFilter();
        providerChanged.addAction("android.intent.action.PROVIDER_CHANGED");
        providerChanged.addDataScheme("content");
        providerChanged.addDataAuthority("com.android.calendar", null);
        context.registerReceiver(receiver, providerChanged);

        IntentFilter userPresent = new IntentFilter();
        userPresent.addAction("android.intent.action.USER_PRESENT");
        context.registerReceiver(receiver, userPresent);

        Log.i(EventAppWidgetProvider.class.getName(), "Registered receivers from " + contextIn.getClass().getName());
        receiversRegistered = true;
    }
    @Override
    public void onUpdate(Context baseContext, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        registerReceivers(baseContext);

        ...
    }

您可以在AndroidManifest.xml文件中以相同的意图注册接收方(这适用于V.7之前的Android...),但请注意,在这种情况下,在logcat中,您仍然会看到“后台执行不允许”,并引用了接收方。这仅仅意味着通过AndroidManifest.xml注册不起作用(与Android8+预期的一样),但是无论如何都应该调用自注册接收器!

 类似资料:
  • 我的应用程序小部件在升级到targetSDk到28后停止工作。 它可以在旧的targetsdk设备上完美地工作。 项目链接供参考。跟随以前的帖子,但没有工作。 Oreo-widget服务和广播接收器:不允许启动服务意图

  • 我的小部件应用程序运行良好的所有android版本,除了8奥利奥。我得到一条消息。 CommonsWare有一个有趣的博客,但我不完全明白为什么它适用于我的情况。https://commonsware.com/blog/2017/04/11/android-o-implicit-broadcast-ban.html TestWidgetReceiver.java manifest.xml:

  • 问题内容: 我被错误卡住了,这里的第42行是,请帮我解决这个问题,我在这个问题上待了几个小时。 这是我的代码: 问题答案: 一个对象只能有一个active对象,因此在执行时,第一个ResultSet()被关闭。 创建两个对象,一个用于,另一个用于。 引用以下内容的javadoc : 默认情况下,每个对象只能同时打开一个对象。因此,如果一个对象的读取与另一对象的读取交错,则每个对象必须已由不同的对象

  • 我只兼职做Android开发(考虑到API的许多细微之处和低级水平,这似乎很有挑战性),并且在我的应用程序处于后台时接收通知有问题。我的目标是Android8.1。我的应用程序碰巧使用了Azure和Xamarin,但我不知道这些细节是否是问题所固有的。 如果我的应用程序在后台,有时会显示通知,但其他时候我的应用程序会因以下错误而崩溃: 我看到这样的文章:https://blog.xamarin.c

  • 据报道,像素设备的Android 11出现了以下崩溃。 致命异常:java.lang.RuntimeException无法启动活动ComponentInfo{}:java.lang.IllegalStateException:不允许启动服务意图{}:应用程序在后台uid UidRecord{} 这只发生在Android 11设备上。谷歌Android 11的服务实现有重大变化吗?