设备唤醒时执行任务

时间:2013-01-12 09:59:50

标签: android screen

我有一个正在从服务更新的小部件。当用户然后关闭屏幕时,服务停止并且当用户唤醒设备时将不再开始更新小部件。那么就我的问题而言,当用户唤醒设备时,是否有某种方法可以“重启”服务?我知道当屏幕被锁定时我可以保持服务继续运行,但我认为它会消耗很多电池然后...我已经google'd很多但没找到任何东西......

提前致谢!

编辑:哦,这很奇怪!现在它以某种方式自动完成,所以它现在正在工作!不管怎样,谢谢!

编辑2:或者,现在我并不认为这是停止服务的屏幕锁定,因为当我使用手机时它有时会随机停止而没有crashdialog ...任何人都知道我应该怎么做才能解决这个问题?

2 个答案:

答案 0 :(得分:1)

是的,这是可能的!

当用户关闭屏幕时您必须处理BroadCast Receiverhttp://developer.android.com/reference/android/content/BroadcastReceiver.html

  • 停止服务的处理方式服务停止并停止更新小部件,

  • 当用户唤醒设备时,您必须开始接收广播以更新小部件。

我认为节省更多电池是最好的选择。

更多信息请参阅此Link

答案 1 :(得分:1)

对于小部件,通常始终保持服务运行没有意义,您通常会定期更新小部件。

执行此操作和提高电池效率的最简单方法是使用AlarmManagersetAlarmInexactRepeating安排意图:

  

安排具有不准确触发时间要求的重复警报;例如,每小时重复一次的警报,但不一定在每小时的顶部重复。这些警报比setRepeating(int,long,long,PendingIntent)提供的严格重复更节能,因为系统可以调整警报的阶段以使它们同时触发,从而避免将设备从睡眠状态唤醒到超过必要的程度。 / p>

意图应该触发BroadcastReceiver,而后者又应该触发您的服务来更新小部件。使用IntentService通常是一个很好的选择。

如果您需要更多地控制意图计划,您还可以在服务完成时自行设置警报以更新窗口小部件,并提供RTCELAPSED_REALTIME作为警报类型。如果设备正在睡眠,两种类型都不会唤醒设备。如果设备没有休眠(但已锁定),您将有效地捎带其他唤醒设备的事件。

如果您确实需要在设备解锁后立即更新,ACTION_USER_PRESENT广播可能就是您所需要的,但我仍然建议将其作为计划定期更新的补充。