[TOC]

最近项目中遇到一个这样的需求,如何使App在接收到指定广播的时候,做特定的事情(启动APP或者做某些数据收集操作)
思考:如果APP已经启动,只需注册相应的广播就可以实现这个需求,但是如果APP从未启动过呢?

问题原因

Android在3.1以后将新安装的应用置为“STOPPED”状态,只有当应用启动过一次之后这个状态才会改变,同时,从Android 3.1开始,系统的包管理器保持跟踪处于停止状态(stopped state)的应用程序,提供了一种控制其从后台进程和其它应用程序启动的方式。这种停止状态的应用程序指那些安装了但从未启动过的apk,或被用户在程序管理中force stop的apk。Android系统为防止广播无意或不必要开启停止状态的组件,它给所有广播intent添加了FLAG_EXCLUDE_STOPPED_PACKAGES标志(不设置和同FLAG_INCLUDE_STOPPED_PACKAGES一起设置结果都是此标志)

简言之就是:从Android 3.1开始,系统给intent定义了两个新的Flag,分别为FLAG_INCLUDE_STOPPED_PACKAGES(表示包含未启动的App)和FLAG_EXCLUDE_STOPPED_PACKAGES(表示不包含未启动的App),用来控制Intent是否要对处于停止状态的App起作用,而默认所有广播intent flag都是FLAG_EXCLUDE_STOPPED_PACKAGES。

解决方案

在发送intent的地方加上FLAG_INCLUDE_STOPPED_PACKAGES

1
2
3
4
Intent intent = new Intent();
intent.setAction("ITBIRD.TEST.ACTION");
intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
sendBroadcast(intent);