很多人遇到过广播收不到的问题,比如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中,我们可以利用BroadcastReceiver(广播接收器)来捕获蓝牙设备的这些状态变化。广播接收器是Android系统中一个重要的组件,它能够监听并响应系统或应用发出的各种广播事件。 以下是一些关键步骤: 1. ...
在Service的onStartCommand()方法中,系统会返回START_STICKY、START_NOT_STICKY或START_REDELIVER_INTENT等标志来控制Service的存活状态。如果返回START_STICKY,即使Service被系统杀死,系统会在条件允许时重新...
在提供的代码片段中,展示了如何创建一个广播接收器(BroadcastReceiver)来响应这些自定义广播,从而控制其他音乐播放器的播放状态。 首先,我们定义了一系列常量,这些常量是Android系统音乐播放器使用的意图动作...
### Android来电时停止音乐播放的流程学习 #### 场景分析 在Android系统中,针对来电时音乐播放的控制机制可以分为以下两种典型场景: 1. **电话处于响铃模式时**: - 当有来电时,系统首先会自动暂停正在后台...
- `onRestart()`:Activity从停止状态变为重新启动状态时调用。在执行`onRestart()`之后,系统会直接调用`onStart()`。 - `onDestroy()`:Activity被永久销毁前调用。这可能是由于内存压力导致系统回收资源,或者...
在Android开发中,监测网络状态的变化是一项非常重要的任务,它能帮助应用及时响应网络的可用性,提升用户体验。本Demo主要展示了如何在Android系统中监听网络连接的状态,并根据网络状态的改变来执行相应的操作。...
在Android开发中,实现“Android悬浮窗口及状态栏显示应用图标”涉及到多个技术点,包括权限申请、系统服务、自定义视图以及通知管理。以下将详细解释这些关键知识点。 1. **悬浮窗口(Floating Window)** 悬浮...
在Android开发中,实现一个HoldingButton来控制录音状态是一个常见的需求,特别是在音频或视频相关的应用中。这个功能允许用户通过长时间按下按钮开始录音,松开按钮则停止录音。下面我们将详细探讨如何实现这样一个...
在Android系统中,程序的停止状态指的是应用程序整体被系统暂停的状态,不同于单个Activity的停止状态。当应用中的所有Activity都不再可见,且系统认为该应用不再需要运行时,就会进入此状态。系统通过包管理器跟踪...
在Android开发中,属性动画(Property Animation)是一个强大的工具,用于实现各种动态效果。`AnimatorSet`是属性动画的一部分,它允许开发者控制多个动画的执行顺序和同步性。本篇文章将详细探讨`AnimatorSet`的...
在Android开发中,线程管理是一项重要的任务,尤其是在处理耗时操作时,如网络请求、数据库操作或大计算量的任务。本篇文章将深入探讨如何合理地结束Android中的线程,以确保应用程序的性能和稳定性。 首先,理解...
- 在Android中,我们可以使用`NotificationCompat.Builder`创建通知,用于在状态栏显示下载进度。设置不同的通知级别(如ONGOING或IN_PROGRESS),并更新通知中的进度信息。 4. **BroadcastReceiver**: - 使用...
在Android开发中,UI设计是不可或缺的一部分,而单选按钮(RadioButton)、复选框(CheckBox)、状态开关(Switch)和时钟控件(Chronometer)是常用的交互元素。这篇文章将深入探讨这些控件的使用方法、功能特性...
在Android系统中,进程意外停止是一个常见的问题,它可能由多种原因引起,包括但不限于软件冲突、应用错误、系统资源不足或是硬件故障等。当遇到进程意外停止时,用户可能会感到困惑和沮丧,因为这通常意味着正在...
在"android可暂停的录制视频(修复秒拍闪退)"这个项目中,开发者使用了Camera类和MediaRecorder类来实现这一功能。下面将详细阐述这两个关键组件以及如何解决快速暂停和恢复导致的闪退问题。 1. **Camera类**:这...
同样,你可以通过发送信号来停止nginx进程,或者监控nginx的日志以获取状态信息。 7. **异常处理和资源清理**:在应用退出或需要关闭nginx时,确保正确地终止进程并清理资源。注意,Android系统可能会在需要时杀死...
Activity的生命周期包括创建、启动、暂停、恢复、停止和销毁等状态,开发者需要理解这些状态以及如何在它们之间进行切换。 2. **Intent**: Intent是Android中的消息传递机制,用于启动其他组件(如Activity或...
(2)修改layout目录下的xml布局文件,添加3个按钮空间和一个文本控件,用于提示当前播放状态和 播放暂停 停止等功能。具体代码如下 <LinearLayout xmlns:android=http://schemas.android.com/apk/res/android ...