zoukankan      html  css  js  c++  java
  • 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起作用。

  • 相关阅读:
    ASP.NET Web API 框架研究 Self Host模式下的消息处理管道
    ASP.NET Web API 框架研究 Web Host模式下的消息处理管道
    ASP.NET Web API 框架研究 核心的消息处理管道
    ASP.NET Web API 框架研究 Web Host模式路由及将请求转出到消息处理管道
    ASP.NET Web API 框架研究 ASP.NET Web API 路由
    ASP.NET Web API 框架研究 ASP.NET 路由
    ASP.NET Web API 入门 (API接口、寄宿方式、HttpClient调用)
    MVVM模式
    RESTful Web API 理解
    C# 函数式编程及Monads.net库
  • 原文地址:https://www.cnblogs.com/scarecrow-blog/p/6080884.html
Copyright © 2011-2022 走看看