我有一个应用程序,它有一个功能A,应该在后台运行每分钟。特征A是应用程序应该连接到数据库,读取一些数据,然后获取设备的当前位置,并根据这些数据检查一个条件,如果条件为真,则应该向用户发送状态条通知,这样当用户单击通知时,应用程序的UI就会显示出来,并发生一些事情。
这个后台任务应该每分钟永久运行一次,不管应用程序被使用、关闭、终止(就像facebook或Whatsapp显示通知,不管它们是否在应用程序栈中)。
现在我已经搜索并发现,Android提供了作业计划程序、后台服务、AlarmManager和Handler。
但我读得越多,这些说法对我来说就越矛盾。
发布于 2017-03-22 22:28:55
我有一个应用程序,它有一个功能A,应该在后台运行每分钟。
这将不会发生在数亿Android设备上,那些运行Android6.0和更高版本的设备,因为Doze模式(可能还有应用程序待机,取决于应用程序的其余部分)。
但是AlarmManager似乎是解决这个问题的好人选,因为在允许的情况下,即使在系统重新启动之后,它们仍然存在。
不,他们没有。您需要在重新启动后重新安排使用AlarmManager调度的所有警报。
警报管理器用于必须在特定时间运行的任务
AlarmManager支持重复选项。
这是更多的任务,如下载在后台,因为我已经读过,而不是打算做的事情,我已经解释了。
无论您最终使用什么解决方案,Service都是必不可少的。
JobScheduler似乎不是用于必须永久执行的任务,而是用于满足特定约束(如空闲或无网络)的任务。
JobScheduler和AlarmManager一样,支持重复作业。
那么,您建议将其中哪些(如果存在)用于我在第一部分中解释的任务。
不要使用它们,因为一旦设备进入Doze模式,就不能在Android 6.0+上每分钟运行东西,而Doze模式将在屏幕关闭后一个小时内运行。相反,要么重新设计应用程序,每天只需要做几次后台工作,要么就不用去编写应用程序了。
发布于 2017-03-22 22:15:09
您可以使用在Android5.0中引入的现代JobScheduler API,如果您的minSdkVersion=21。
还有https://github.com/firebase/firebase-jobdispatcher-android,它需要安装Google minSdkVersion=9
但我建议使用这个库https://github.com/evernote/android-job,根据安卓版本的不同,将使用JobScheduler、GcmNetworkManager或AlarmManager。
使用这些API,您可以调度作业并运行描述任务的服务。
更新现在最好使用新的WorkManager (文档)。android-job很快就会被废弃
发布于 2017-05-12 11:06:39
首先,JobService是一种服务。后台服务是模棱两可的,我猜您指的是在后台线程中运行的服务。作业服务在ui线程上运行,但您可以在其中创建一个异步任务对象,使其在后台运行。
从您的问题来看,JobService不是我建议的go.What的方法:
1. In your manifest, register your service and reciever
引导权限是让接收者被调用--系统已经完成了引导--一旦调用了接收者,服务就会再次被调用。
https://stackoverflow.com/questions/42963494
复制相似问题