`

Android中的停止状态

 
阅读更多

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

 

        从Android3.1(HoneyComb)也就是API12开始,Android引入了一套新的启动控制,这就是程序的停止状态。那我么看一下Google对于程序的停止状态的描述。

 

        什么是停止状态

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

        从Adroid3.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,用来让发送广播的一方决定广播是否需要同时发送给已经停止的程序。

 

        Intent.FLAG_INCLUDE_STOPPED_PACKAGES  —— Include intent filters of stopped applications in the list of potential targets to resolve against.

        将已经支持的程序加入到能处理intent的目标处理者。

 

        Intent.FLAG_EXCLUDE_STOPPED_PACKAGES —— Exclude intent filters of stopped application from the list of potential targets.

        在能处理intent的目标处理者中不包含已经停止的程序。

 

        当如果intent中没有或者设置了上面两个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 broadcasets from background services from inadvertently or unnecessarily launching components of stopped applications. A background service or application can override this behavior by adding the FLAG_INCLUDE_STOPPED_PACKAES flag to broadcast intents that should be allowed to activate stopped applications.

        需要注意的是,系统会默认地对所有的广播增加一个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框架揭秘

 

        

 

        

 

        

         

分享到:
评论

相关推荐

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

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

    Android 使用mediaplayer播放res/raw文件夹中的音乐的实例

    (2)修改layout目录下的xml布局文件,添加3个按钮空间和一个文本控件,用于提示当前播放状态和 播放暂停 停止等功能。具体代码如下 &lt;LinearLayout xmlns:android=http://schemas.android.com/apk/res/android ...

    Android代码-一个简单但可以自定义切换动画的管理多状态的自定义layout

    StateLayout A custom layout that can easily switch different states(like empty,error,progress,content) with animations. An example usage can be found here lufficc/iShuiHui Usage Add the dependencies ...

    Android中获取后台正在运行的应用列表

    在Android设备中,按Back键会将当前的Activity出栈销毁,而按HOME键却会将之隐藏到后台。如若有多个这样的程序这样操作,我们不知道后台到底有多少个正在运行的应用程序。此程序的目的就列举出后台正在运行的应用...

    android 让某个应用保持不休眠的方法

    在正常情况下,Android系统会让程序和服务进入休眠状态以节约电量使用。然而在开发Android程序时,有时候在程序运行的时候,不能让系统休眠,否则有一些运行会停止,因此我们需要设置禁止休眠。文档里面有两种方法,...

    android自定义HorizontalScrollView

    android自定义HorizontalScrollView。 滑动停止后,其中的子元素始终保持左边对齐的状态。防止出现显示不全的情况

    《Android内核剖析》的附图(无乱码)

    《Android内核剖析》一书附带的图 附图名称如下: 附图1:Framework基本框架 附图2:Activity中创建窗口的过程 附图3:点击图标启动Activity 附图4:Activity的停止以及内存回收时机 附图5:按键消息获取流程 ...

    Android自主学习项目报告(一).doc

    运行状态:Activity位于前台,用户可见,获得焦点 暂停状态: Activity可见,但被其它Activity覆盖,没有获得焦点 停止状态:不可见,失去焦点 销毁状态:Activity结束,或所在进程被结束 Activity有4种启动模式,...

    Android锁屏无法继续定位问题

    手机锁屏后,Android系统为了省电以及减少CPU消耗,在一段时间后会将手机进入休眠状态。此时的服务以及线程等都会停止。 最近就这个问题,阅读了很多代码以及官方文档,下面就说下最近都尝试过的方式,可能其中有些...

    《Google Android SDK开发范例大全(第3版)》.pdf

    6.4 开始与停止系统服务 312 6.5 通过短信发送e-mail通知 316 6.6 手机拨接状态 321 6.7 有来电,发送邮件通知 324 6.8 存储卡剩余多少容量 326 6.9 访问本机内存与存储卡 329 6.10 实现可定时...

    疯狂Android讲义源码

     12.3.1 在Android应用中使用  OpenGL ES 454  12.3.2 绘制平面上的多边形 457  12.3.3 旋转 463  12.4 绘制3D图形 465  12.4.1 构建3D图形 465  12.4.2 应用纹理贴图 469  12.5 本章小结 475  第13章 ...

    chargeguy:适用于 Tesla Model S 和 Android 设备的充电状态监控工具

    充电小子适用于 Tesla Model S 和 Android 设备的充电状态监控工具。要求Android 设备(4.0.4 或更高版本) 特斯拉 Model S 汽车概述ChargeGuy 会在两个预定警报时监控您的汽车,以检查汽车是否已插入电源并具有最小...

    Android中的Activity生命周期总结

    Activity生命周期一般分为四个基本状态,分别是活动状态(running),暂停状态(paused),停止状态(stopped)和死亡状态。 1.活动状态(running) 活动状态一般是指该Activity正处于屏幕最显著的位置上显示,即该Activity...

    Android acitivity &Intent;

    如果一个Activity被另外的Activity完全覆盖掉,叫做停止状态(Stopped)。它依然保持所有状态和成员信息,但是它不再可见,所以它的窗口被隐藏,当系统内存需要被用在其他地方的时候,Stopped的Activity将被强行终止...

    Android代码-FloatingMusicMenu

    一款可用于音乐播放器的悬浮菜单按钮,它是基于 FloatingActionButton 上完成,能够联动音乐播放器显示歌曲的进度,设置歌曲的封面和通过封面的旋转来展示播放的状态(停止或者播放)。 除此之外,它可以设置一组...

    Android非凡行车记录仪源码

    如果设置中的GPS开关处于打开状态,那么在录像时,APP就会定时记下当前位置,并绑定到对应录像文件的对应时间点上,点击地图上的坐标点,可跳转到对应视频的对应时间点开始进行播放; 4. 文件清理 APP每次启动时,...

    Google Android SDK开发范例大全(第3版) 1/5

    6.4 开始与停止系统服务 6.5 通过短信发送E-mail通知 6.6 手机拨接状态 6.7 有来电,发送邮件通知 6.8 存储卡剩余多少容量 6.9 访问本机内存与存储卡 6.10 实现可定时响起的闹钟 6.11 黑名单来电自动静音 6.12 手机...

Global site tag (gtag.js) - Google Analytics