我应该使用带有AlarmManager的PendingIntent.getService()或getBroadcast吗?

mar*_*lar 41 service android alarmmanager

我的应用需要在每天的特定时间从网上获取一些数据.所以我使用AlarmManager来安排任务,这是正常的.

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

一个用于PendingIntent.getBroadcast()在闹钟响起时呼叫广播接收器,并且在该接收器内部开始执行实际工作的服务.

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

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

编辑:还有一个问题是在使用getService()时获取唤醒锁定的位置?

例如,当使用BroadcastReceiver时,我在onReceive()中有以下行:

WakeReminderIntentService.acquireStaticLock(context);
Run Code Online (Sandbox Code Playgroud)

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

PendingIntent pi = PendingIntent.getService(this, 0, new Intent(this, OnAlarmReceiver.class), PendingIntent.FLAG_UPDATE_CURRENT);
Run Code Online (Sandbox Code Playgroud)

我应该简单地从服务中获取它吗?

Vin*_*kla 19

一个用于在闹钟响起时PendingIntent.getBroadcast()调用a broadcast receiver,在该接收器内部开始执行实际工作的服务.

它在启动服务方面还有一个步骤

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

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

  • 必须使用PendingIntent.getBroadcast(..)来避免服务未启动。系统为接收器的onReceive()方法持有唤醒锁。它不对服务这样做。因此,请确保使用PendingIntent.getBroadcast。请参阅https://developer.android.com/reference/android/app/AlarmManager.html以获得参考。 (4认同)
  • "那么你应该使用第二种方法,因为它减少了你执行的一步":如果这是唯一的区别,肯定是的.但我想知道是否存在更微妙的差异,可能会影响性能等. (3认同)

sch*_*rer 13

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

所以现在为你的编辑:什么时候获得锁定?使用接收器的重点是获取接收器onReceive()方法内的锁定,因为Android在执行此方法时不会入睡.

例如,请看这个问题.