一、使用场景
Android开发中,当你需要创建在后台运行的程序的时候(主进程不能进行耗时操作),就要使用到Service。
音乐播放器:后台服务来处理音乐播放。
视频播放器:后台服务来处理视频播放。
文件下载:后台服务下载文件。
定位服务:后台服务跟踪用户的位置。
天气更新:后台服务定期更新天气信息。
数据统计等等
二、IntentService和Service区别
Service:
1、默认不创建单独的工作线程,所有的代码都是在应用程序的主线程中运行。需要自己手动管理多线程,例如在onStartCommand中启动线程或者使用ExecutorService来执行任务。如果在Service的onStartCommand方法中直接执行耗时操作会阻塞主线程(UI线程),所以通常耗时任务需要在新的线程中执行。
2、需要显式停止服务(通过stopSelf()或stopService()),否则它可能会一直运行,即使你的任务已经完成。
IntentService:
1、是Service的一个子类,onHandleIntent方法是你需要实现的地方。它使用一个工作队列的方式将所有的Intent逐个进行处理,并且每个Intent都在单独的工作线程中执行,因此它不会阻塞主线程。
2、处理完所有启动请求后IntentService会自行停止,不需要手动停止它。
IntentService适用于不与用户界面直接交互而需要执行后台耗时任务的场景。比如下载文件。
注: IntentService在API level 30已被弃用,Google现在推荐使用JobIntentService或者结合WorkManager来执行后台任务。这是由于Android系统为了优化内存和电量消耗增加了对后台服务的限制。这些新的API提供了更灵活的后台任务调度能力,并更好地适应了Android系统的节能策略。
三、Service和Thread的区别
Service是系统的四大组件之一,是一种轻量级的IPC通信,Thread 是程序执行的最小单元,它是分配CPU的基本单位。可以用 Thread 来执行一些异步的操作。两者区别在于以下几点
- Service可以设置独立的进程;Thread不可以,只能存在于进程中。
- Service有自己的生命周期。如果是以bind的方式启动,生命周期跟activity相同。如果是以start方式启动,不调用stop会一直运行在后台;Thread运行完了就结束了,启动后跟activity没有关系了,哪怕activity结束了,thread也会在后台运行。
- Service不依赖于其他组件,在一个没有任何Activity的应用程序中Service可以独立创建并执行,而Thread需要依附于一个已经运行起来的组件才可以创建运行。
- Service如果是运行在后台的,可以注册接收系统或自定义广播;Thread不能接收广播。
-
不同的Activity可以调用同一个Service;不同的Activity不能调用同一个Thread。
举个例子:如果你的 Thread 需要不停地隔一段时间就要连接服务器做某种同步的话,该 Thread 需要在 Activity 没有start的时候也在运行。这个时候当你 start 一个 Activity 就没有办法在该 Activity 里面控制之前创建的Thread。因此你便需要创建并启动一个 Service ,在 Service 里面创建、运行并控制该 Thread,这样便解决了该问题(因为任何 Activity 都可以控制同- Service,而系统也只会创建一个对应 service 的实例)。 - 不同的应用程序可以共享同一Service,但不能共享同一Thread。
- service中可以创建thread,避免ANR。
- Thread在后台运行(Activty stop)的优先级低于后台运行的Service,如果执行系统资源紧张,会优先杀死Thread,后台运行的Service一般情况下不会被杀死,如果被杀死,系统空闲时会重新启动service。
service使用场景:播放音乐、更新天气预报数据、数据统计等等。