【问题标题】:Should I use PendingIntent.getService() or getBroadcast with AlarmManager?我应该在 AlarmManager 中使用 PendingIntent.getService() 还是 getBroadcast?
【发布时间】:2013-10-11 03:47:25
【问题描述】:

我的应用需要在每天的特定时间从网络上获取一些数据。所以我使用 AlarmManager 来安排任务并且工作正常。

但在查看各种示例时,似乎有两种方法可以处理待处理意图时的 AlarmManager。

当警报响起时,使用PendingIntent.getBroadcast() 调用广播接收器,并在该接收器内部启动执行实际工作的服务。

另一种方法是使用PendingIntent.getService() 并在警报响起时直接调用服务。

有人可以向我解释这两种方法之间的区别,以便我决定依赖哪一种吗?

编辑:还有一个问题是使用 getService() 时在哪里获取唤醒锁?

例如,当使用广播接收器时,我在 onReceive() 中有以下行:

WakeReminderIntentService.acquireStaticLock(context);

如果我直接调用服务,我应该如何获取唤醒锁:

PendingIntent pi = PendingIntent.getService(this, 0, new Intent(this, OnAlarmReceiver.class), PendingIntent.FLAG_UPDATE_CURRENT);

我应该直接从服务中获取它吗?

【问题讨论】:

  • 无论哪种方式都无所谓。您可以使用 IntentService 或 Service,或者本地或全局广播。你应该能够在所有这些中做同样的事情。

标签: android service alarmmanager


【解决方案1】:

当警报响起时,使用PendingIntent.getBroadcast() 调用broadcast receiver 并且在该接收器内部启动了执行实际工作的服务。

它比启动服务多一步

另一种方法是使用PendingIntent.getService() 并在警报响起时直接调用服务。

那么你应该使用第二种方法,因为它减少了你的执行步骤..

【讨论】:

  • “那么你应该使用第二种方法,因为它减少了你的执行步骤”:如果这是唯一的区别,那么肯定是的。但我想知道是否存在更细微的差异,可能会影响性能等。
  • 必须 PendingIntent.getBroadcast(..) 避免服务未启动。系统为接收者的 onReceive() 方法持有唤醒锁。它不为服务这样做。所以请确保您使用 PendingIntent.getBroadcast。请参阅developer.android.com/reference/android/app/AlarmManager.html 以供参考。
【解决方案2】:

阅读您的编辑我想您发现自己:如果您想确保在使用 AlarmManager 时启动您的服务,您最好绕道先发送到接收器并在那里获取唤醒锁. 否则手机可能会在请求的服务启动之前休眠。 这就是javadoc of AlarmManager 所说的,我也在Google engineer 的帖子中读到了它。

现在进行编辑:何时获取锁? 使用receiver的重点是在receiver的onReceive()方法中获取锁,因为Android在这个方法执行过程中不会进入休眠状态。

有关示例,请参阅此question

【讨论】:

    猜你喜欢
    • 2012-10-25
    • 1970-01-01
    • 1970-01-01
    • 2012-03-10
    • 2018-09-05
    • 1970-01-01
    • 2015-07-15
    • 2011-12-31
    • 2020-10-14
    相关资源
    最近更新 更多