Android中程序的停止状态详细介绍

 更新时间:2015年01月17日 11:54:49   投稿:junjie  
这篇文章主要介绍了Android中程序的停止状态详细介绍,本文讲解了什么是程序的停止状态、为什么Android要引入这一状态、激活状态和停止状态的切换、如何变为停止状态等内容,需要的朋友可以参考下

很多人遇到过广播收不到的问题,比如Google Play推广安装广播没有收到等,诸如这些问题,又都是什么原因呢,这篇文章将进行回答.

从Android 3.1(HoneyComb) 也就是API 12开始,Android引入了一套新的启动控制,这就是程序的停止状态.那让我们看一下Google对于程序的停止状态的描述.

什么是程序的停止状态

复制代码 代码如下:

Starting from Android 3.1, the system's package manager keeps track of applications that are in a stopped state and provides a means of controlling their launch from background processes and other applications.

从Android 3.1开始,系统的包管理器开始跟踪处理停止状态的程序.并且提供了方法来控制从后台进程或者其他程序对它们的启动.

Note that an application's stopped state is not the same as an Activity's stopped state. The system manages those two stopped states separately.

注意 程序的停止状态和Activity的停止状态不同,系统会单独处理这两种状态.

The platform defines two new intent flags that let a sender specify whether the Intent should be allowed to activate components in stopped application. Android平台提供了两个intent flags,用来让发送广播的一方决定广播是否需要同时发送给已经停止的程序.

FLAG_INCLUDE_STOPPED_PACKAGES — Include intent filters of stopped applications in the list of potential targets to resolve against. 将已经支持的程序加入到能处理intent的目标处理者.

FLAG_EXCLUDE_STOPPED_PACKAGES — Exclude intent filters of stopped applications from the list of potential targets. 在能处理intent的目标处理者中不包含已经停止的程序.


当如果intnet中没有或者设置了上面两个flag,在目标处理者中是包含已经处于停止的程序.但是注意,系统会为所有的广播intent增加FLAG_EXCLUDE_STOPPED_PACKAGES这个flag.

为什么Android要引入这一状态

复制代码 代码如下:

Note that the system adds FLAG_EXCLUDE_STOPPED_PACKAGES to all broadcast intents. It does this to prevent broadcasts from background services from inadvertently or unnecessarily launching components of stoppped applications. A background service or application can override this behavior by adding the FLAG_INCLUDE_STOPPED_PACKAGES flag to broadcast intents that should be allowed to activate stopped applications.

需要注意的是,系统会默认地对所有的广播intent增加一个FLAG_EXCLUDE_STOPPED_PACKAGES的flag,这样做的目的是为了阻止来自后台服务的广播不慎或者启动处于停止状态的程序的不必要的组件.

通常的intnet广播,处于停止状态的程序的receiver是无法接受到的.那么怎么才能让这些停止状态的程序接受到呢?可以这样做,在后台服务或者应用中发送广播时,增加一个FLAG_INCLUDE_STOPPED_PACKAGES 的flag,意思是包含处于停止状态的程序.这样就可以激活停止状态的程序.

正如上述引用指出,系统默认阻止广播intent发送给处于停止状态的程序包,实际上这是为了保证安全和省电需要.比如说网络变化的广播,如果某些程序注册监听,并且它在得到广播时,做一系列的网络操作,这样必然是很耗能源的.

激活状态和停止状态的切换

当程序第一次安装并且没有启动,或者用户手动从程序管理将其停止后,程序都会处于停止状态.

如何变为停止状态

1.在设置应用管理中的应用详情页点击强制停止
2.使用adb shell adb shell am force-stop package-name
3.使用ActivityManager的隐藏方法forceStopPackages,并且向manifest加入申请权限<uses-permission 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

问答环节

提问:如果我的程序没有activity只有一个receiver,我改如何激活才能接收到正常的广播intent呢

回答:实际上,如果是上面所述的情况,该应用在安装之后不是处于停止状态,因为它没有任何用户可以直接点击的行为去将它移除停止状态.你可以正常接收广播intent,除非你人为地将它强制停止.

提问:系统的程序刚安装会处于停止状态么?

回答:系统的程序通常会存放在 /system/app目录下,在一开始安装之后不会处于停止状态.

提问:Google Play的推广广播据说是在程序安装完成之后发送,是不是3.1之后受影响么

回答:不受影响的.Google文档说INSTALL_REFERRER会在程序安装完成之后发送,据实际查看日志观察,从3.1之后,是在程序安装后第一次打开时发送.

相关文章

  • Android实现简单的banner轮播图

    Android实现简单的banner轮播图

    这篇文章主要为大家详细介绍了Android实现简单的banner轮播图,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-05-05
  • Android实现滚动刻度尺效果

    Android实现滚动刻度尺效果

    本篇文章主要介绍了Android实现滚动刻度尺效果,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • Android如何实现扫描和生成二维码

    Android如何实现扫描和生成二维码

    这篇文章主要为大家详细介绍了Android如何实现扫描和生成二维码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-05-05
  • Android开发简易音乐播放器

    Android开发简易音乐播放器

    这篇文章主要为大家详细介绍了Android开发简易音乐播放器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12
  • Android实现自定义的弹幕效果

    Android实现自定义的弹幕效果

    现在的视频网站基本都带有弹幕效果,满屏幕的文字从右到左飘来飘去。看起来还蛮炫的,这篇文章就是来实现这个效果,大部分的都是从右向左移动漂移,本文的效果中也支持从左向右的漂移移动效果,同时也支持屏幕弹幕最多显示个数的设置。有需要的可以参考借鉴。
    2016-08-08
  • Android实现人脸支付的示例代码

    Android实现人脸支付的示例代码

    本文主要介绍了Android实现人脸支付,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • Android添加(创建)、删除及判断是否存在桌面快捷方式的方法

    Android添加(创建)、删除及判断是否存在桌面快捷方式的方法

    这篇文章主要介绍了Android添加(创建)、删除及判断是否存在桌面快捷方式的方法,涉及Android针对桌面快捷方式的相关操作技巧,需要的朋友可以参考下
    2015-05-05
  • Android星级评分条控件RatingBar使用详解

    Android星级评分条控件RatingBar使用详解

    这篇文章主要为大家详细介绍了Android星级评分条控件RatingBar的使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • android图像绘制(六)获取本地图片或拍照图片等图片资源

    android图像绘制(六)获取本地图片或拍照图片等图片资源

    从SD卡中获取图片资源,或者拍一张新的图片,然后再进行处理(直接处理返回图片/获得图片的地址再处理)接下来为您详细介绍,感兴趣的朋友可以了解下
    2013-01-01
  • Android View背景选择器编写技巧

    Android View背景选择器编写技巧

    本文主要介绍了Android View背景选择器编写技巧,具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02

最新评论