我有一个用例,每当事务完成或失败时,我必须在后台等待(不要冻结UI)5分钟并在没有用户干预的情况下调用一段代码。所以AFAIK我需要为此实现后台服务。
我想知道哪种情况对我的情况有好处。
在Oreo及以上版本中,如果我运行后台服务,它会在通知中显示应用程序在后台运行吗?
答案 0 :(得分:2)
现在推荐的后台处理方法是Jetpack WorkManager API。我将引用官方文档,原因如下:
WorkManager根据设备API级别和应用程序状态等因素选择适当的方式来运行任务。如果WorkManager在应用程序运行时执行您的任务之一,WorkManager可以在您应用程序的新流程中运行您的任务。如果您的应用程序未运行,WorkManager会选择适当的方式来安排后台任务 - 根据设备API级别和包含的依赖项,WorkManager可能会使用JobScheduler,Firebase JobDispatcher或AlarmManager。您不需要编写设备逻辑来确定设备具有哪些功能并选择适当的API;相反,您可以将您的任务交给WorkManager,让它选择最佳选项。
此外,WorkManager还提供了一些高级功能。例如,您可以设置一系列任务;当一个任务完成时,WorkManager会排队链中的下一个任务。您还可以通过观察其LiveData来检查任务的状态及其返回值。如果您想显示指示任务状态的UI,这将非常有用。
因此,不必担心每次选择哪种后台处理(因为每个任务都有推荐和适当的方式),您只需使用WorkManager就可以完成它的工作。
这是考虑以下问题:
WorkManager适用于需要保证即使应用程序退出系统也会运行它们的任务,例如将应用程序数据上传到服务器。如果应用程序进程消失,它不适用于可以安全终止的进程内后台工作;对于这种情况,我们建议使用ThreadPools。
P.S。由于WorkManager API使用JobScheduler,Firebase JobDistpacher或AlarmManager,您必须考虑使用功能的最低API级别。 JobScheduler需要最低API 21,Firebase JobDispatcher需要最低API 14和Google Play服务。
完整的文档检查:https://developer.android.com/topic/libraries/architecture/workmanager
对于您的第二个问题:据我所知,您将始终看到该通知,因为它通知用户您的应用正在消耗电池。用户可以从Android Oreo 8.1中的设置禁用该通知。
答案 1 :(得分:0)
展望未来,官方的Android文档建议您使用JobScheduler代替后台服务。
在许多情况下,先前为隐式广播注册的应用程序可以通过使用JobScheduler作业获得类似的功能。例如,社交照片应用可能需要不时对其数据执行清理,并且在设备连接到充电器时更喜欢这样做。以前,该应用程序在其清单中注册了ACTION_POWER_CONNECTED接收器;当应用程序收到该广播时,它将检查是否有必要进行清理。要迁移到Android 8.0或更高版本,应用程序会从其清单中删除该接收器。相反,应用程序会安排在设备空闲和充电时运行的清理作业。 https://developer.android.com/about/versions/oreo/background#services
答案 2 :(得分:0)
WorkManager可能(最终)是您正在寻找的解决方案。它充当抽象,决定是否使用JobScheduler(如果它可用)Firebase JobDispatcher(如果它可用)或否则回退到默认实现。这样,您就可以获得最好的世界。但是,它仍处于alpha状态,因此您可能至少需要考虑其他选项。
如果您选择不使用WorkManager,JobScheduler和JobDispatcher的组合可能是合适的(请参阅here)。
但是,如果您定位的设备没有API 22以下的Google Play服务,则需要使用其他解决方案。在这种情况下AlarmManager可能正是您正在寻找的,因为您需要一个保证执行的延迟任务。为此可以使用IntentService,但不是那么容易。它涉及引入某种延迟机制,其中有几种选择。
请注意,如果您使用Job API或WorkManager之一使用批处理机制,则不会在Oreo中看到通知。基于AlarmManager / IntentService的解决方案可能会显示通知,但可能不会很长时间,因为任务很短。对于AlarmManager尤其如此。