目录
Android 前台服务和后台服务区别
前台服务(Foreground Service):
后台服务(Background Service):
总结:
前台服务更新:
JobScheduler、WorkManager 区别和使用方式
android.app.ForegroundServiceStartNotAllowedException: Service.startForeground() 咋解决?
WorkManager
Android 前台服务和后台服务区别
在 Android 中,前台服务(Foreground Service)和后台服务(Background Service)是两种不同类型的服务,它们在功能和系统对待上有一些区别。
前台服务(Foreground Service):
官方文档 https://developer.android.com/guide/components/foreground-services
-
前台服务是一种可见的服务,它会在状态栏显示一个通知,告知用户有一个正在运行的服务。
-
前台服务在执行某些需要用户知晓或与用户交互的任务时非常有用,例如播放音乐、下载文件等。
-
前台服务被认为是用户体验的一部分,因此系统会给予其更高的优先级,不易被系统终止。
-
使用前台服务时,需要调用 startForeground() 方法启动服务,并提供一个与服务相关的通知。
-
当您使用前台服务时,必须显示通知,以便用户主动了解该服务正在运行。除非服务停止或从前台删除,否则无法关闭此通知。
后台服务(Background Service):
官方文档 https://developer.android.com/guide/background#categories_of_background_tasks
-
后台服务是一种在后台执行任务的服务,用户不会直接感知其存在。
-
后台服务通常用于执行不需要用户交互的长时间运行任务,例如数据同步、定期更新等。
-
后台服务的优先级较低,系统可能会在资源紧张时终止其运行,以释放系统资源。
-
使用后台服务时,通常调用 startService() 方法启动服务。
总结:
-
前台服务适用于用户知晓和需要与用户交互的任务,系统对其优先级更高,通常用于长时间运行的任务。
-
后台服务适用于不需要用户交互且无需用户感知的任务,系统对其优先级较低,可能会在资源紧张时终止其运行。
需要注意的是,从 Android 8.0(API 级别 26)开始,引入了后台服务限制,即后台服务在后台执行任务时受到了一些限制。在后台执行任务时,应使用适当的后台执行方式,例如使用 JobScheduler、WorkManager 或者前台服务来确保任务的执行和系统资源的合理利用。
前台服务更新:
从 Android 13(API 级别 33)开始,用户可以默认关闭与前台服务关联的通知。为此,用户在通知上执行滑动手势。传统上,除非前台服务停止或从前台删除,否则通知不会被忽略。
JobScheduler、WorkManager 区别和使用方式
JobScheduler和WorkManager是Android中用于调度和执行后台任务的两个不同的工具,它们具有一些区别和适用场景。
JobScheduler:
-
JobScheduler是Android提供的调度任务的系统服务,从Android 5.0(API级别21)开始引入。
-
JobScheduler使用灵活的条件和触发器机制来调度任务的执行。可以基于时间、设备空闲状态、网络连接状态等条件来触发任务。
-
JobScheduler适用于需要延迟执行或周期性执行的后台任务,例如同步数据、更新操作等。
-
JobScheduler具有更低的功耗和资源消耗,系统会根据条件自动决定何时执行任务,以节省电量和系统资源。
使用JobScheduler的示例:
// 创建JobInfo对象
JobInfo jobInfo = new JobInfo.Builder(JOB_ID, new ComponentName(context, YourJobService.class))
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
.setRequiresCharging(true)
.build();
// 获取JobScheduler
JobScheduler jobScheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
// 调度任务
jobScheduler.schedule(jobInfo);
WorkManager:
-
WorkManager是Android Jetpack组件之一,用于执行可延迟、可靠和灵活的后台任务,从Android 5.0(API级别21)及以上版本可用。
-
WorkManager提供了一种简单且强大的方式来处理后台任务,包括延迟执行、周期性执行、设备闲置时执行等。
-
WorkManager在不同版本的Android上提供一致的行为,自动适应系统和设备的要求。
-
WorkManager适用于需要可靠执行和保证任务完成的后台任务,例如上传文件、发送通知等。
使用WorkManager的示例:
// 创建OneTimeWorkRequest对象
OneTimeWorkRequest workRequest = new OneTimeWorkRequest.Builder(YourWorker.class)
.setConstraints(new Constraints.Builder()
.setRequiredNetworkType(NetworkType.UNMETERED)
.setRequiresCharging(true)
.build())
.build();
// 调度任务
WorkManager.getInstance(context).enqueue(workRequest);
总结:
-
如果你需要灵活的任务调度机制,并且在Android 5.0及以上版本上使用,可以选择JobScheduler。
-
如果你需要一种可靠的、跨版本的后台任务执行方式,并且使用Android Jetpack组件,可以选择WorkManager。
-
对于Android 5.0以下的设备,你可以根据需要选择适合的方式,例如使用AlarmManager或自定义的后台服务。
需要根据你的具体需求、目标版本和功能特性来选择合适的后台任务调度工具。
android.app.ForegroundServiceStartNotAllowedException: Service.startForeground() 咋解决?
在 Android 12+ 上,要在后台启动前台服务,需要满足一些额外的条件,例如应用必须具有合适的权限或者是使用合适的 API 来请求前台服务的启动。如果不满足这些条件,就会抛出 ForegroundServiceStartNotAllowedException 异常。
解决这个异常的方法是考虑使用适当的后台任务调度方式,如使用 WorkManager 来替代前台服务。WorkManager 提供了一种可靠的后台任务执行机制,能够适应 Android 5.0(API 级别 21)及以上版本,并且避免了后台服务限制的问题。
WorkManager
官方文档 https://developer.android.com/guide/background#categories_of_background_tasks