我的应用需要在每天的特定时间从网上获取一些数据。所以我使用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);
我应该简单地从服务中获取它吗?
答案 0 :(得分:19)
一个人使用PendingIntent.getBroadcast()
在闹钟响起时调用broadcast receiver
,在该接收者内部开始执行实际工作的服务。
它比启动服务还要多一步
另一种方法是使用PendingIntent.getService()
并在闹钟响起时直接调用服务。
然后你应该使用第二种方法,因为它减少了你执行的一步......
答案 1 :(得分:13)
阅读您的编辑我认为您已经找到了自己:如果您想确保在使用AlarmManager
时启动您的服务,您最好绕道首先发送到接收器并获取唤醒锁定那里。
否则,在启动所请求的服务之前,手机可能会休眠。
这就是javadoc of AlarmManager
所说的内容,我也在帖子Google engineer中读到了它。
现在进行编辑:何时获取锁定?
使用接收器的重点是在接收器的onReceive()
方法中获取锁定,因为Android在执行此方法时不会入睡。
有关示例,请参阅此question。