如何修复 Boot _COMPLETED不工作的Android

dsekswqp  于 2022-12-25  发布在  Android
关注(0)|答案(9)|浏览(304)

我知道已经有几百个这样的问题被问到了,但是我已经检查了一段时间,仍然没有找到任何解决办法。
我看到this answer to "Android BOOT_COMPLETED not received when application is closed"BOOT_COMPLETED不会发送到应用程序,除非用户先启动你的应用程序,在Android版本3.1之后,但我仍然看到一些应用程序正在这样做,所以一定有一个方法。我真的需要处理它,否则我也反对做一些没有用户交互的事情。
以下是我的Android清单:

<manifest ... >

<!-- to be activated service on boot is completed -->
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<!-- Keeps the processor from sleeping when a message is received. -->
<uses-permission android:name="android.permission.WAKE_LOCK" />

<application ... >
    <!-- to receive data when boot completed -->
    <receiver
        android:name="myPackage.BootReceiver"
        android:enabled="true"
        android:exported="true"
        android:permission="android.permission.RECEIVE_BOOT_COMPLETED" >
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
    </receiver>
</application>
</manifest>

**编辑:**在我的广播接收机中没有太多东西可看,但这里需要的是:

package myPackage
public class BootReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
    Utils.LogI("BootReceiver", "BootReceiver received!");
    if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
        // Do my stuff
    }
}
}
3ks5zfa0

3ks5zfa01#

下面的东西对我很有效

    • 安卓清单. xml**
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

<application>    

    <receiver android:name=".BootCompletedReceiver" >
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
            <action android:name="android.intent.action.QUICKBOOT_POWERON" />
        </intent-filter>
    </receiver>

    <service android:name="NotifyingDailyService" >
    </service>
    • 启动完成接收器类**
public class BootCompletedReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent arg1) {
    // TODO Auto-generated method stub
    Log.w("boot_broadcast_poc", "starting service...");
    context.startService(new Intent(context, NotifyingDailyService.class));
}

}
    • 服务等级**
public class NotifyingDailyService extends Service {

@Override
public IBinder onBind(Intent arg0) {
    // TODO Auto-generated method stub
    return null;
}

@Override
public int onStartCommand(Intent pIntent, int flags, int startId) {
    // TODO Auto-generated method stub
    Toast.makeText(this, "NotifyingDailyService", Toast.LENGTH_LONG).show();
    Log.i("com.example.bootbroadcastpoc","NotifyingDailyService");

    return super.onStartCommand(pIntent, flags, startId);
}
}
hxzsmxv2

hxzsmxv22#

这是一个古老而基本的问题,但许多Android开发人员现在仍然对这个问题感到困惑,因为他们没有花时间仔细阅读文档
我看到有人分享了一些链接,并说:“这行不通了”,这完全是错误的误解
关于这个问题:* “我看到的回答是,在Android版本3.1之后,除非用户先启动应用程序,否则 Boot _COMPLETED不会发送到应用程序”*,请阅读以下几行(来自官方文档:https://developer.android.com/about/versions/android-3.1.html#launchcontrols)才能正确理解:

    • 请注意,应用程序的停止状态活动的停止状态不同。系统分别管理这两种停止状态。*
    • 当应用程序首次安装但尚未启动以及用户手动停止时(在管理应用程序中),应用程序处于停止状态。*(它们表示强制停止应用程序)

1.这意味着用户应在安装后启动应用至少一次以激活应用,然后应用可以正常接收来自操作系统的隐式广播。(仅启动一次!
1.
“是否有任何应用程序安装后从未打开
甚至只打开过一次
?"
,是的,这是垃圾邮件和诈骗应用程序,这种技术可以帮助用户防止这种情况!

此外,直到现在(Android Oreo 8.0),当Android限制在Manifest(https://developer.android.com/about/versions/oreo/background.html#broadcasts)上注册隐式广播时,一些广播目前仍不受这些限制。** Boot _COMPLETED是他们提到的第一个**!*(https://developer.android.com/guide/components/broadcast-exceptions.html

  • 顺便说一下,这是我找到的这个问题的最佳解决方案:*
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

<receiver android:name=".BootReceiver" android:enabled="true" android:exported="true">
            <intent-filter>
                <category android:name="android.intent.category.DEFAULT"/>
                <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"/>
            </intent-filter>
        </receiver>

最后,请仔细阅读文档并三思而后行:3!

mutmk8jj

mutmk8jj3#

一些新的平板电脑和安卓设备默认有一个安全应用程序。有时这些应用程序会阻止您的自动启动模式。MyAsus管理器就是一个安全应用程序的例子。在这种情况下,用户需要在应用程序管理器中为所有希望接收此 Boot _COMPLETED的应用程序添加“允许自动启动

gblwokeq

gblwokeq4#

***对于HTC设备***添加com.htc.intent.action.QUICKBOOT_POWERON

<receiver android:enabled="true" android:name=".receivers.BootUpReceiver">
        <intent-filter>
            <category android:name="android.intent.category.DEFAULT" />
            <action android:name="android.intent.action.BOOT_COMPLETED"/>
            <action android:name="android.intent.action.QUICKBOOT_POWERON"/>
            <action android:name="com.htc.intent.action.QUICKBOOT_POWERON"/>
         </intent-filter>
    </receiver>
2w2cym1i

2w2cym1i5#

对于像我一样仍然有这个问题的其他人,如果您在有 Boot 锁(pin、pattern或其他)的设备上调试,OS版本〉= 7.0需要订阅android.intent.action.LOCKED_BOOT_COMPLETED,如下所示:

<receiver
    android:directBootAware="true"
    android:name=".BootCompletedReceiver">
    <intent-filter>
        <action android:name="android.intent.action.BOOT" />
        <action android:name="android.intent.action.LOCKED_BOOT_COMPLETED" />
        <action android:name="android.intent.action.QUICKBOOT_POWERON" />
    </intent-filter>
</receiver>

您可以在以下链接中找到该文档:https://developer.android.com/training/articles/direct-boot

f45qwnt8

f45qwnt86#

问题出在设备上。某些设备只允许内部应用程序接收此操作(例如:安卓5.1)。
您可以将此添加到Intent过滤器中作为解决方法
动作android:name="android.intent.action.USER_PRESENT"
这在用户解锁设备后触发。

nqwrtyyt

nqwrtyyt7#

我遇到的问题是BOOT_COMPLETEDQUICKBOOT_POWERON一起并不总是触发我的意图,当我从我的Android 6.0.1面板关闭电源时。我已经在互联网上搜索了相当长的时间,并通过添加QUICKBOOT_POWEROFF到清单文件找到了解决方案。
另见:
HTC's "fast boot" is not broadcasting BOOT_COMPLETED intent nor wiping intents from alarm manager

b1zrtrql

b1zrtrql8#

如果您找到了这个答案,而其他答案似乎都不起作用,请仔细检查清单中的操作字符串。如果您在action标签中写入了错误的字符串,AndroidStudio不会显示任何错误。不要将代码中常量的名称(ACTION_BOOT_COMPLETED)与所述常量的value(清单中的常量)混淆,并且等于android.intent.action.BOOT_COMPLETED
TL;DR检查清单中是否包含以下内容:

<intent-filter>  
    <action android:name="android.intent.action.BOOT_COMPLETED" />  
</intent-filter>

而不是这个:

<intent-filter>  
    <action android:name="android.intent.action.ACTION_BOOT_COMPLETED" />  
</intent-filter>
txu3uszq

txu3uszq9#

要解决此问题,您需要创建NotificationListener服务
如果设备是〉= Build.VERSION_CODES.JELLY_BEAN_MR2,并且有一个电池优化选项,如华为设备,那么你必须请求NotificationListener权限,并创建一个NotificationListener服务,如下面的代码所示,然后你将在你的接收器中获得 Boot _COMPLETED

清单接收人:

<receiver
                android:name=".TestRes"
                android:enabled="true"
                android:exported="true">
                <intent-filter android:priority="1">
                    <category android:name="android.intent.category.DEFAULT"/>
                    <action android:name="android.intent.action.BOOT_COMPLETED"/>
                    <action android:name="android.intent.action.QUICKBOOT_POWERON"/>
                    <action android:name="android.intent.action.USER_PRESENT"/>
                    <action android:name="android.intent.action.REBOOT"/>
                </intent-filter>
 </receiver>

1创建通知监听器服务:

@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
public class DevAppNotificationListener extends NotificationListenerService {

    @Override
    public void onNotificationPosted(StatusBarNotification sbn) {
//        super.onNotificationPosted(sbn);
    }

    @Override
    public void onNotificationRemoved(StatusBarNotification sbn) {
   //     super.onNotificationRemoved(sbn);
    }

}

2检查是否授予NotificationListener:

static boolean CheckNotificationLisPermission(Context context)
    {

        return NotificationManagerCompat.getEnabledListenerPackages (context).contains(context.getApplicationContext().getPackageName());

    }

3如果没有,则请求NotificationListener权限:

Intent intent = new Intent("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS");
            context.startActivityForResult(intent, callBackResultIntent);

相关问题