当前位置: 首页 > 编程笔记 >

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

潘璞瑜
2023-03-14
本文向大家介绍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中AsyncTask详细介绍,包括了Android中AsyncTask详细介绍的使用技巧和注意事项,需要的朋友参考一下 AsyncTask是一个很常用的API,尤其异步处理数据并将数据应用到视图的操作场合。其实AsyncTask并不是那么好,甚至有些糟糕。本文我会讲AsyncTask会引起哪些问题,如何修复这些问题,并且关于AsyncTask的一些替代方案。 Async

  • 注:在 Status.Code 中通过枚举的方式定义状态码,这些状态码的定义非常的有参考和借鉴价值,因此详细翻译了一遍。 定义和注释 OK(0):成功 操作成功完成 CANCELLED(1):被取消 操作被取消(通常是被调用者取消) UNKNOWN(2):未知 未知错误。这个错误可能被返回的一个例子是,如果从其他地址空间接收到的状态值属于在当前地址空间不知道的错误空间(注:看不懂。。。)。此外,A

  • 本文向大家介绍vue store之状态管理模式的详细介绍,包括了vue store之状态管理模式的详细介绍的使用技巧和注意事项,需要的朋友参考一下 状态管理 一、状态管理(vuex)简介 uex是专为vue.js应用程序开发的状态管理模式。它采用集中存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。vuex也集成刀vue的官方调试工具devtools extensio

  • 本文向大家介绍Android中的广播(BroadCast)详细介绍,包括了Android中的广播(BroadCast)详细介绍的使用技巧和注意事项,需要的朋友参考一下 什么是广播 在Android中,Broadcast是一种广泛运用的在应用程序之间传输信息的机制。我们拿广播电台来做个比方。我们平常使用收音机收音是这样的:许许多多不同的广播电台通过特定的频率来发送他们的内容,而我们用户只需要将频率调

  • 本文向大家介绍Android NDK开发详细介绍,包括了Android NDK开发详细介绍的使用技巧和注意事项,需要的朋友参考一下 Android之NDK开发  一、NDK产生的背景   Android平台从诞生起,就已经支持C、C++开发。众所周知,Android的SDK基于Java实现,这意味着基于Android SDK进行开发的第三方应用都必须使用Java语言。但这并不等同于“第三方应用只能

  • 本文向大家介绍Android onCreate( )方法详细介绍,包括了Android onCreate( )方法详细介绍的使用技巧和注意事项,需要的朋友参考一下 onCreate( )方法是android应用程序中最常见的方法之一,那么,我们在使用onCreate()方法的时候应该注意哪些问题呢?     先看看Google Android Developers官网上的解释:     onCre