美文网首页
Android 为什么无法监听到开机广播了?

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

作者: SunnyGL | 来源:发表于2019-06-25 09:05 被阅读0次

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

    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开机自启无法实现。

    相关文章

      网友评论

          本文标题:Android 为什么无法监听到开机广播了?

          本文链接:https://www.haomeiwen.com/subject/nymzqctx.html