首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >工作计划程序与背景服务

工作计划程序与背景服务
EN

Stack Overflow用户
提问于 2017-03-22 22:02:51
回答 7查看 38K关注 0票数 46

我有一个应用程序,它有一个功能A,应该在后台运行每分钟。特征A是应用程序应该连接到数据库,读取一些数据,然后获取设备的当前位置,并根据这些数据检查一个条件,如果条件为真,则应该向用户发送状态条通知,这样当用户单击通知时,应用程序的UI就会显示出来,并发生一些事情。

这个后台任务应该每分钟永久运行一次,不管应用程序被使用、关闭、终止(就像facebook或Whatsapp显示通知,不管它们是否在应用程序栈中)。

现在我已经搜索并发现,Android提供了作业计划程序后台服务AlarmManagerHandler

但我读得越多,这些说法对我来说就越矛盾。

  1. 关于处理程序,我已经读到它们不存在很长的延迟,并且将在系统重新启动后终止。所以他们不适合我的任务。
  2. 但是AlarmManager似乎是解决这个问题的好人选,因为在允许的情况下,即使在系统重新启动之后,它们仍然存在,并且可以重新运行应用程序。但是在Android文档中,警报管理器被用于必须在特定时间运行的任务(比如闹钟)。但我的任务必须每时每刻都在执行。
  3. 还有后台服务处。这是更多的任务,如下载在后台,因为我已经读过,而不是打算做的事情,我已经解释了。
  4. JobScheduler似乎不是用于必须永久执行的任务,而是用于满足特定约束(如空闲或无网络)的任务.那么,您建议将其中哪些(如果存在)用于我在第一部分中解释的任务。
EN

回答 7

Stack Overflow用户

发布于 2017-03-22 22:28:55

我有一个应用程序,它有一个功能A,应该在后台运行每分钟。

这将不会发生在数亿Android设备上,那些运行Android6.0和更高版本的设备,因为Doze模式(可能还有应用程序待机,取决于应用程序的其余部分)。

但是AlarmManager似乎是解决这个问题的好人选,因为在允许的情况下,即使在系统重新启动之后,它们仍然存在。

不,他们没有。您需要在重新启动后重新安排使用AlarmManager调度的所有警报。

警报管理器用于必须在特定时间运行的任务

AlarmManager支持重复选项。

这是更多的任务,如下载在后台,因为我已经读过,而不是打算做的事情,我已经解释了。

无论您最终使用什么解决方案,Service都是必不可少的。

JobScheduler似乎不是用于必须永久执行的任务,而是用于满足特定约束(如空闲或无网络)的任务。

JobSchedulerAlarmManager一样,支持重复作业。

那么,您建议将其中哪些(如果存在)用于我在第一部分中解释的任务。

不要使用它们,因为一旦设备进入Doze模式,就不能在Android 6.0+上每分钟运行东西,而Doze模式将在屏幕关闭后一个小时内运行。相反,要么重新设计应用程序,每天只需要做几次后台工作,要么就不用去编写应用程序了。

票数 36
EN

Stack Overflow用户

发布于 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,根据安卓版本的不同,将使用JobSchedulerGcmNetworkManagerAlarmManager

使用这些API,您可以调度作业并运行描述任务的服务。

更新现在最好使用新的WorkManager (文档)。android-job很快就会被废弃

票数 15
EN

Stack Overflow用户

发布于 2017-05-12 11:06:39

首先,JobService是一种服务。后台服务是模棱两可的,我猜您指的是在后台线程中运行的服务。作业服务在ui线程上运行,但您可以在其中创建一个异步任务对象,使其在后台运行。

从您的问题来看,JobService不是我建议的go.What的方法:

  1. 您可以在该类的IntentService方法中创建扩展onDestroy (在后台线程上运行)的类,发送广播并使广播重新启动服务。 @onDestroy(){ broadcastIntent =新意图(“com.example.myapp.serviceRestarted”);sendBroadcast(broadcastIntent);}
  2. 创建一个扩展广播接收者的类 公共类RestartServiceReceiver扩展了BroadcastReceiver {@覆盖公共空onReceive(上下文上下文,意图意图){context.startService(新意图( context,MyService.class));}
代码语言:javascript
复制
1. In your manifest, register your service and reciever 

引导权限是让接收者被调用--系统已经完成了引导--一旦调用了接收者,服务就会再次被调用。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42963494

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档