奥利奥服务

Service in Oreo

我正在开发一个应用程序(minSDK = 19 & targetSDK = 26),其中有 20 个服务,例如MediaPlayer、SyncUpData 和 SyncDownData 等服务。因为 Android O 不允许长时间的 运行 后台服务。我很困惑在 JobScheduler、FirebaseJobDispature、JobIntentService 等之间进行选择,因为 JobShecduler 在 API 21 中引入,而 FirebaseJobDispature 在 API 14 中引入。

另一个问题是如何检查哪些服务需要用上述框架替换,哪些不需要。

有 3 个服务应该 运行 即使应用程序不可见,因为这些服务 sends/receives 数据包 to/from 蓝牙设备。他们将在应用程序终止或手动断开连接时停止 运行。

我知道网上有很多解决方案,但我不知道应该使用哪个。

请为此提出合适的解决方案。 TIA

最好用的是新的 WorkManager 库。 它包装了所有可能的 API 级场景:

  • Uses JobScheduler for API 23+
  • For API 14-22 If using Firebase JobDispatcher in the app and the optional Firebase dependency, uses Firebase JobDispatcher
  • Otherwise, uses a custom AlarmManager + BroadcastReceiver implementation

此外,here一些文献和使用示例。

WorkManager 用例仅适用于需要保证执行的后台作业,即使在应用程序被终止后也是如此。

如果您需要前台服务,那么只需通过扩展 Service class 自行创建即可。对于奥利奥,您需要显示 UI 通知。然后服务可以在下一次调用时作为前台启动:

ContextCompat.startForegroundService(context, yourService);

尽管如果服务仅在应用程序处于活动状态时存在,并通过应用程序手动停止或只要应用程序存在,那么您应该考虑使用线程而不是服务。

Quote 来自 android 文档:

If you need to perform work outside your main thread, but only while the user is interacting with your application, then you should probably instead create a new thread and not a service. For example, if you want to play some music, but only while your activity is running, you might create a thread in onCreate(), start running it in onStart(), then stop it in onStop(). Also consider using AsyncTask or HandlerThread, instead of the traditional Thread class. See the Processes and Threading document for more information about threads.

Remember that if you do use a service, it still runs in your application's main thread by default, so you should still create a new thread within the service if it performs intensive or blocking operations.