一 、问题现象

最近项目上遇见这样一个需求,在程序安装之后,如果收到特定广播,需要程序做XXXX(具体的场景就不写了),我当时想到的方案是在AndroidMainfest文件里添加一个静态注册的广播,比如:

<receiver android:name=".receiver.XXXReceiver">   
    <intent-filter>        
        <action android:name="XXX.XXX"/>   
    </intent-filter> 
</receiver>

本以为这样就完事了,但是在测试过程中发现如果程序曾经启动过一次,那么一切都正常,如果是新安装应用,重来都没启动过,这个时候是收不到广播的。。。。

二、问题分析

我是觉得这个不是什么多大的问题,但是测试妹子让我解决,好吧,只好网上搜一搜答案,一查发现这是因为Android在3.1以后将新安装的应用置为“STOPPED”状态,只有当应用启动过一次之后这个状态才会改变。 至于这样改的目的是什么啦?这个就需要大家自己去考虑了。。

三、问题解决方法

这个问题我们需要修改两个地方来解决:

  1. 在静态注册广播的时候 指定exported = true

    <receiver android:name=".receiver.AddWidgetReceiver" android:exported="true">   
        <intent-filter>        
            <action android:name="XXX.XXX"/>   
        </intent-filter> 
    </receiver>
    
  2. 在发送intent的地方加上FLAG_INCLUDE_STOPPED_PACKAGES:

    Intent intent = new Intent(); intent.setAction("XXX.XXX");
    intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
    sendBroadcast(intent);
    

    原因是从Android 3.1开始,系统给Intent定义了两个新的Flag,分别为FLAG_INCLUDE_STOPPED_PACKAGES(表示包含未启动的App)和FLAG_EXCLUDE_STOPPED_PACKAGES(表示不包含未启动的App),用来控制Intent是否要对处于停止状态的App起作用。

文章作者: 嘿手大叔
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 i·Space
Android
喜欢就支持一下吧
打赏
微信 微信
支付宝 支付宝