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

时间:2011-09-05 12:45:46

标签: android service alarmmanager

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

但是在查看各种示例时,就未决意图而言,似乎有两种方法可以处理AlarmManager。

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

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

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

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

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

WakeReminderIntentService.acquireStaticLock(context);

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

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

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

2 个答案:

答案 0 :(得分:19)

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

它比启动服务还要多一步

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

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

答案 1 :(得分:13)

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

现在进行编辑:何时获取锁定? 使用接收器的重点是在接收器的onReceive()方法中获取锁定,因为Android在执行此方法时不会入睡。

有关示例,请参阅此question