Android 前台服务讲解

目录

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

猜你喜欢

转载自blog.csdn.net/zyy_give/article/details/131602476