应用程序终止后广播接收器不接收

Posted

技术标签:

【中文标题】应用程序终止后广播接收器不接收【英文标题】:Broadcast Receiver doesn't receive after app killed 【发布时间】:2014-03-06 02:18:03 【问题描述】:

我创建了一个广播接收器来管理这些事件(ACTION_SCREEN_ON、ACTION_SCREEN_OFF 和 ACTION_USER_PRESENT)。我在我的主要活动中像这样注册我的广播接收器

IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
filter.addAction(Intent.ACTION_SCREEN_OFF);
filter.addAction(Intent.ACTION_USER_PRESENT);

mReceiver = new UnlockReceiver();


registerReceiver(mReceiver, filter);

我的问题是 UnlockReceiver 在我的应用程序被杀死后没有收到(当我从应用程序选择器中滑动它时)。我有这个问题,因为这些广播不能在 Manifest 上声明我已经尝试使用 Service 和 AlarmManager 解决它。我该如何解决?

【问题讨论】:

参考 Commons Ware 对***.com/questions/10398053/…的回答 “我的问题是 UnlockReceiver 在我的应用程序被杀死后没有收到(当我从应用程序选择器中滑动它时)” - 这是因为您的进程已终止,因此您的接收器不再存在。 “我该如何解决?” ——有什么要解决的?用户将您的应用从最近的任务列表中滑出,表明该用户不希望您的应用运行。 我想在 SCREEN_OF、SCREEN_ON 或 USER_ACTION 发生时执行我的接收器,就像在 Manefiest 中声明这些广播一样 我终于解决了这个问题。我已经在 Manifest 中为 ACTION_USER_PRESENT 声明了一个广播接收器(这个可以在那里声明,我不知道),当这个广播接收器执行时,我为 ACTION_SCREEN_OFF 注册另一个广播接收器。我已删除 ACTION_SCREEN_ON,我不需要它 【参考方案1】:

您在活动中动态注册广播接收器,这就是它不起作用的原因。

在清单中静态声明它会起作用,但这不是你的情况。

我有一个工作区,由您决定是否使用它:

使用始终在后台运行的粘性服务,并在服务中注册您的广播接收器。

【讨论】:

正是我所期待的【参考方案2】:

android 3.1 开始,系统的包管理器会跟踪处于停止状态的应用程序,并提供一种控制它们从后台进程和其他应用程序启动的方法。

请注意,应用程序的停止状态与 Activity 的停止状态不同。系统分别管理这两个停止状态。

平台定义了两个新的 Intent 标志,让发送者指定是否应允许 Intent 激活停止的应用程序中的组件。

FLAG_INCLUDE_STOPPED_PACKAGES — 在要解决的潜在目标列表中包含已停止应用程序的意图过滤器。 FLAG_EXCLUDE_STOPPED_PACKAGES — 从潜在目标列表中排除已停止应用程序的意图过滤器。 如果在意图中没有或同时定义这两个标志,则默认行为是在潜在目标列表中包含已停止应用程序的过滤器。

https://developer.android.com/about/versions/android-3.1.html

【讨论】:

以上是关于应用程序终止后广播接收器不接收的主要内容,如果未能解决你的问题,请参考以下文章

Android 静态广播和动态广播接收顺序

为啥下载管理器完成后广播接收器不调用?

android有序广播和无序广播的区别

onResume 后广播接收器不工作

广播接收器——接收系统广播

应用程序关闭后保持广播接收器运行