【问题标题】:Do BroadcastReceivers need to be their own process to be independent from the UI (activities)?BroadcastReceivers 是否需要自己的进程才能独立于 UI(活动)?
【发布时间】:2013-04-25 02:36:48
【问题描述】:

因此,我正在开发一个应用程序,该应用程序使用 AlarmManager 广播意图,让我的接收器完成一项简单的任务并快速完成。我希望我的接收器每隔几分钟运行一次,所以我使用setRepeating 来确保这一点。我不想担心我的应用程序的主要活动正在运行或在警报触发时可见。为了让我的接收器像这样与主要活动分开运行,我是否需要在清单中将android:process=":remote" 添加到接收器?还是它们本身就已经是分开的东西了?两者不需要沟通。我正在尽最大努力在不取消任何警报的情况下终止活动,并且接收器目前似乎运行正常,但我想知道它是否会继续工作几个小时或几天。

【问题讨论】:

    标签: android broadcastreceiver repeatingalarm


    【解决方案1】:

    是的,它们是分开的。无需使用该属性。

    顺便问一下,你在那个 BroadcastReceiver 中做了多少工作?通常,您不能在 BroadcastReceiver 本身内部做很多事情,您可以使用它来触发其他事情。

    另外,我想知道您是如何执行以下操作的:

    “我正在尽我所能终止活动......”

    我想知道你试图通过杀死活动来解决什么问题?

    【讨论】:

    • onReceive 启动一个线程,该线程发出 Web 请求并将结果存储在 sqlite 数据库中。我必须在线程中执行此操作,因为有时我强制从活动中进行广播,并且它会抛出异常以访问 ui 线程上的网络。
    • 你不能从你的 BroadcastReceiver 开始一个线程,你必须从你的 onReceive 做一个 startService 和一个 IntentService 代替:developer.android.com/reference/android/app/IntentService.html
    • 我在下一个 AlarmManager 事件被触发之前终止进程,这样即使活动没有运行,我也知道事件正在发生。至于“你不能开始一个线程......”我是并且它正在工作。为什么我不能?
    • 也许我应该说的是我的 onReceive 明确地开始了一个新线程。我不希望 onReceive 已经成为它自己的线程。
    • 该线程将获得较低的优先级,并且可能比 IntentService 更早被终止(甚至比服务更早)。除此以外,还可能有其他一些原因。我得再研究一下这个话题。
    【解决方案2】:

    对于您的直接问题 - 当然不是 - 这将成为性能杀手,并且无论如何都不需要。

    对于您的设计 - 有缺陷。你应该:

    1. 注册警报(还要注意在启动时重新注册) - 请参阅 wakeLock does not wait for network connectivity 了解注册警报的代码
    2. 当 AlarmaManager 将您的接收者唤醒委托给 WakefulIntentService 时。不保证 Intent 服务在设备处于睡眠状态时运行(请参阅Android deep sleep and wake locks)。

    另见:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-13
      • 1970-01-01
      • 1970-01-01
      • 2015-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-23
      相关资源
      最近更新 更多