• Android无法收到指定广播的问题总结


    简单的小例子,一个是只有一个Receiver捕捉有网络改变的常驻广播,另外一个是在第一个的基础上增加了一个Activity。试验证明,第一种情况是收不到广播的! 第二种情况是可以收到广播的。所以android程序中,不能只有一个Receiver组件,必须还要Activity。据说这是google对android应用程序安全的考虑,防止流氓软件潜水消耗资源,正所谓禁止潜水也!

    • Android应用在未启动的情况下无法收到指定广播

    一 、问题现象 
    最近项目上遇见这样一个需求,在程序安装之后,需要收到特定广播,我当时想到的方案是在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起作用。

  • 相关阅读:
    11.关于django的content_type表
    6.re正则表达式
    1.关于python 的hmac加密
    4.瀑布流js
    10.django的一些方法理解
    7.一些比较有用的网站
    准备辞职了,走之前想解决的问题ptr 为空
    Oracle 代码生成小工具免费下载
    Js 中一个判断类型的方法
    jQuery 加上最后自己的验证
  • 原文地址:https://www.cnblogs.com/scarecrow-blog/p/6080884.html
Copyright © 2020-2023  润新知