2017-06-21 48 views
0

我的应用需要在用户点击一个按钮12或24小时后执行myAction()Android - AlarmManager或TimerTask/Timer在x小时内执行操作?

我知道我不能使用handler.postDelayed(Runnable, long)这是因为long参数是基于uptime而不是实际时间。

所以我觉得我只是留下了TimerTask/TimerAlarmManager,但我不知道其中哪些是最合适的 - 再加上,我听到了很多有关的TimerTask /定时器坏的评论,说这是不可靠等

另外,我有要求,如果设备重新启动,那么我仍然需要myAction()执行在同一时间(或尽可能快),就好像该设备从来没有已关闭。对于这个要求,也许我需要将myAction()的详细信息存储在数据库中,然后在设备重新启动时使用BootReceiver调用它来执行,但是如果有类可以处理这个问题,它也会很好。

那么在12/24小时的时间内调用myAction()的适当和可靠的方法是什么,同时适应设备重启?

+1

“我听到很多关于TimerTask/Timer的错误评论,说它不可靠“ - 好吧,它假设你的过程会持续很长时间。这是不太可能的,除非它是前台服务,并且这往往会刺激用户,除非有明显的原因。即使它是前台服务,也不能保证你的流程能够持续这么久,尽管它更有可能。一般来说,考虑到正在进行的后台处理战争,除了闹钟情景之外,试图在特定时间进行后台工作将会相当严重。 – CommonsWare

回答

1

使用GCM网络管理器或Firebase作业调度程序。 这是在Android上进行定期工作的两种最佳实践方法。

https://developers.google.com/cloud-messaging/network-manager#run_tasks

https://github.com/firebase/firebase-jobdispatcher-android

(注意,尽管其名称所暗示,他们正在推动的消息有关,他们不是。无论是在设备上本地运行周期的工作方案。)

+0

我尝试了Firebase作业调度程序方法,但在设备重启过程中不起作用。但是,重新启动设备后,GCM网络管理器方法确实有效。 (为了坚持跨设备重启,你只需要在你的'OneoffTask.Builder'中添加'.setPersisted(true)')。目前为止只有1到3分钟的窗口进行过测试,所以将使用24到下一个25小时的窗口,然后我会在这里发布更新。顺便说一句,这里有一个很棒的GCM网络管理器教程:https://codelabs.developers.google.com/codelabs/android-network-manager/index.html?index=..%2F..%2Findex#0。 –

+1

顺便说一句,GCM网络管理器和FB替代支持都在重启后持续存在。 – Shmuel

+1

好的,谢谢。无论如何,我会坚持使用GCM网络管理器,因为'myAction()'正在执行网络内容。 –

相关问题