需要注意的是,系统会默认地对所有的广播增加一个FLAG_EXCLUDE_STOPPED_PACKAGES的flag,这样做的目的是为了阻止来自后台服务器的广播不慎或者启动处于停止状态的程序的不必要的组件。
通常的intent广播,处于停止的程序的receiver是无法接受到的。那么怎么才能让这些停止状态的程序接收到呢?可以这样做,在后台服务或者应用中发送广播时,增加一个FLAG_INCLUDE_STOPPED_PACKAGES的flag,意思是包含处于停止状态的程序。这样就可以激活停止状态的程序。
正如上述引用指出,系统默认阻止广播Intent发送给处于停止状态的程序包,实际上这是为了保证安全和省电需要。比如说网络变化的广播,如果某些程序注册,并且它在得到广播时,做一系列的网络操作,这样必然是很耗电的。
激活状态和停止状态的切换
当程序第一次安装并且没有启动,或者用户手动从程序管理讲其停止后,程序都会处于停止状态。
如何变为停止状态
1.在设置应用管理中的应用详情页点击强制停止
2.使用adb shell :adb shell am force-stop package-name
3.使用ActivityManager的隐藏方法forceStopPackages,并且向manifest加入申请权限<uses-permisssion android:name="android.permission.FORCE_STOP_PACKAGES"/>
如何脱离停止状态
1.手动启动程序
2.使用adb激活应用组件,如activity或者receiver
发送广播intent给处于停止状态的应用
1.在Java代码发送Intent时,加入flag FLAG_INCLUDE_STOPPED_PACKAGES

2.如果使用adb,同样是加入FLAG_INCLUDE_STOPPED_PACKAGES(其具体值为32),如adb shell am broadcast -a com.android.vending.INSTALL_REFERRER -f 32
检查是否处于停止状态
1.进入设置——应用管理——某个应用的详细页,如果强制停止按钮不可用,则说明程序已经处于停止状态。
2.进入设备终端,查看文件系统 cat /data/system/packages-stopped.xml
相关疑点
1.如果我的程序没有activity,只有一个receiver,我该如何激活才能接收到正常的广播intent呢?
实际上,如果这种情况,改应用在安装后不是处于停止状态,因为它没有任何用户可以直接点击的行为去将它移除停止状态。你可以正常接收广播intent,除非你人为地将它强行停止。
2.系统的程序刚安装会处于停止状态么?
系统的程序通常会存放在/system/app目录下,在一开始安装后不会处于停止状态。
3.Google play的推广广播据说是在程序安装后发送,是不是3.1之后受影响么
不会受影响。Google文档说INSTALL_REFERRER会在程序安装完成之后发送,据实际查看日志观察,从3.1后,是在程序安装后第一次打开时发送。
应用参考
Android 3.1 Hignlight
其他
Android开发权威指南
Android框架揭秘
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-21669-2.html
不过男同的比例远远大于女同
希望尽快能改善
还是要打气