Android 为什么无法监听到开机广播了?

2019-06-25  本文已影响0人  SunnyGL

如果你的项目需要监听到开机广播,以此实现开机自启等类似功能,你到网上搜索一下,基本上都是搜到以下实现方法。

1.创建一个BroadcastReceiver,在BroadcastReceiver的onReceive方法中添加启动相应Activity的代码。
public class BootUpReceiver extends BroadcastReceiver {

    public BootUpReceiver() {
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        if (TextUtils.equals(intent.getAction(), "android.intent.action.BOOT_COMPLETED")) {
            Intent intentMain = new Intent(context, MainActivity.class);
            intentMain.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(intentMain);
        }
    }
}
2.在AndroidMainfest中注册该广播接收器。
<receiver
       android:name=".receiver.BootUpReceiver"
       android:enabled="true"
       android:exported="true">
       <intent-filter android:priority="1000">
            <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
</receiver>

亲测以上方法在我的一加5(Android 9)上是不管用的,其他博主给出的在第2步添加对SD卡加载完成等事件的广播监听方法,也是没有任何效果,一直不太明白网上大家都给出的一致方法,为啥就没效果了,难道是Android在后来的系统版本中,对这一块做了改动?直到前段时间看到了《Android开发艺术探索》中关于广播的发送和接受过程的一段讲解,终于解开了我的疑惑,原文摘抄如下:

在Android 3.1之后, 为Intent添加了两个标记位,分别是FLAG_INCLUDE_STOPPED_PACKAGES和
FLAG_EXCLUDE_STOPPED_PACKAGES,用来控制广播是否要对处于停止状态的应用 起作用,它们的含义
如下所示。

FLAG_INCLUDE_STOPPED_PACKAGES
表示包含已经停止的应用,这个时候广播会发送给已经停止的应用。

FLAG_EXCLUDE_STOPPED_PACKAGES
表示不包含已经停止的应用,这个时候广播不会发送给已经停止的应用。

从Android 3.1开始,系统为所有广播默认添加了 FLAG_EXCLUDE_STOPPED_PACKAGES标志,这样做是
为了防止广播无意间或者在不必要的时候调起已经停止运行的应用。

如果的确需要调起未启动的应用,那么只需要为广播的Intent添加
FLAG_INCLUDE_STOPPED_PACKAGES标记即可。

当FLAG_EXCLUDE_STOPPED_PACKAGES和FLAG_INCLUDE_STOPPED_PACKAGES两种标记位共存时,
以FLAG_INCLUDE_STOPPED_PACKAGES为准。这里需要补充一下,一个应用处于停止状态分为两种情形:
第一种是应用安装后未运行,第二种是应用被 手动或者其他应用强停了。Android 3.1中广播的这个特
性同样会影响开机广播,从 Android 3.1开始,处于停止状态的应用同样无法接收到开机广播,而在
Android 3.1之前, 处于停止状态的应用是可以收到开机广播的。

通过上面这段话,我们可以知道,如果想让广播能够发送到未启动的应用,必须为广播的Intent添加FLAG_INCLUDE_STOPPED_PACKAGES标记,但是开机广播是系统发出的,我们无法修改。综上所述,自Android3.1之后,App开机自启无法实现。

上一篇下一篇

猜你喜欢

热点阅读