Android 常规任务(相当于 cronjob)
Posted
技术标签:
【中文标题】Android 常规任务(相当于 cronjob)【英文标题】:Android regular task (cronjob equivalent) 【发布时间】:2011-07-13 02:51:26 【问题描述】:上次(由其他用户)提出此问题时,答案是:
如果这是在一个正在运行的活动中,你可以使用 Timer/TimerTask 和一个 Handler,或者你可以使用 postDelayed() 和一个 AsyncTask。
这里:android Repetitive Task
我还在学习如何编写 android。我已经掌握了我所知道的技能,包括线程,并且我的代码有很多问题。谁能举例说明如何使用:time/timertask 和 handler 或 postDelayed() 和 AsyncTask。
【问题讨论】:
google的参考其实还不错。 developer.android.com/reference/android/os/AsyncTask.html 【参考方案1】:对于类似 Cron 的任务,您必须使用 AlarmManager,这是一个系统服务,在您的代码中使用它需要调用:
AlarmManager myAlarmManager = Context.getSystemService(Context.ALARM_SERVICE).
关于 AlarmManager here.的完整文档
【讨论】:
如果我有一个 cron 表达式,如何为警报管理器设置重复?!【参考方案2】:最合适的方法是通过服务。我通过查看 Android 中包含的电子邮件应用程序的源代码学习了如何编写服务。
一般的想法是你覆盖Service类,并设置alarms来激活你的服务。与守护进程和 Windows 服务不同,Android 服务并不总是在运行——它们会启动(通常在被警报激活时)、执行工作,然后关闭。在某些情况下,您可能需要获取partial wake lock 以保持服务运行,直到它完成任务 - 否则,Android 可能会过早地终止您的服务。
【讨论】:
当(后台)服务正在更新数据库并且用户点击应用程序打开它时,您会做什么? 为什么会有任何不同? SQLite is a transactional database 完全支持 ACID 但是如果您当前视图中显示的数据已经过时了,比如在服务开始更新数据前一分钟,该怎么办? 您有两个选择 - 您可以定期检查“更新”数据,或者通过 ContentProvider 执行所有写入。在这种情况下,CursorAdapter 将自动更新任何依赖此类数据的列表,您可以使用ContentObserver 收到其他内容更新的通知。 使用内容提供者的得分是否高于使用预写日志记录?【参考方案3】:如果你想构建一个 cronjob 运行器,那么你想要的是 Service:
Service 是一个应用程序组件,可以在后台执行长时间运行的操作,并且不提供用户界面。另一个应用程序组件可以启动一个服务,即使用户切换到另一个应用程序,它也会继续在后台运行。此外,组件可以绑定到服务以与其交互,甚至执行进程间通信 (IPC)。例如,服务可能会在后台处理网络事务、播放音乐、执行文件 I/O 或与内容提供者交互。
【讨论】:
服务与 cronjob 不太像,请参阅下面关于 AlarmManager 的答案。以上是关于Android 常规任务(相当于 cronjob)的主要内容,如果未能解决你的问题,请参考以下文章
kubernetes(k8s)Job 和 Cronjob 的使用