1、什么是停止状态?
①Android3.1开始,Package Manager开始跟踪处理停止状态的程序,并提供了从后台进程或其他程序对它们启动的方法;
②程序的停止状态和Activity的停止状态不同,系统会分开处理这两种状态;
③Android平台提供了两个Intent flag用来让广播发送方决定广播是否需要同时发送给已经停止的程序。
- FLAG_INCLUDE_STOPPED_PACKAGES -- 将已经停止的程序加入到能处理intent的目标处理者。
- FLAG_EXCLUDE_STOPPED_PACKAGES -- 在能处理intent的目标处理者中不包括已经停止的程序。
2、为什么要引入停止状态?
系统会默认为所有广播添加FLAG_EXCLUDE_STOPPED_PACKAGES,目的是阻止来自后台服务的广播不慎启动了处于停止状态的不必要的组件。是为了保证安全和省电需要,如网络变化的广播,若某些程序注册监听,并且它在接收到广播时,做一系列的网络操作,会很耗能源。
3、激活状态与停止状态的切换
当程序第一次安装,并且没有启动,或者手动从程序管理器将其停止后,程序都会处于停止状态。
- 如何变为停止状态
a、在设置应用管理中的应用详情页点击强制停止
b、使用adb shell am force-stop package-name
c、使用ActivityManager的隐藏方法forceStopPackages,并且向manifest加入申请权限
<uses-permission android:name=“android.permission.FORCE_STOP_PACKAGES”/>
- 如何脱离停止状态
a、手动启动程序
b、使用adb激活应用组件,如activity或者receiver
4、如何发送广播intent给处于停止状态的应用?
- 在Java代码发送Intent时,加入flag FLAG_INCLUDE_STOPPED_PACKAGES;
- 如果使用adb,同样是加入FLAG_INCLUDE_STOPPED_PACKAGES(其具体值为32 如adb shell am broadcast -a com.android.vending.INSTALL_REFERRER -f 32
5、如何检查是否处于停止状态?
- 进入设置—应用管理—某个应用的详细页,如果强制停止按钮不可用,则说明程序已经处于停止状态;
- 进入设备终端,查看系统文件cat /data/system/packages-stopped.xml
6、如果应用中只有组件BroadcastReceiver,而无Activity,应该如何激活才能正常收到广播?
实际上,如果是上面所述的情况,该应用在安装之后不是处于停止状态,因为它没有任何用户可以直接点击的行为去将它移除停止状态.
你可以正常接收广播intent,除非你人为地将它强制停止.
7、系统的程序刚刚安装时是否处于停止状态?
系统的程序通常会存放在 /system/app目录下,在一开始安装之后不会处于停止状态.