一、服务(Service)
Service是Android系统中的四大组件之一,它是一种长生命周期的,没有可视化界面,运行于后台的一种服务程序,用于在后台完成用户指定的操作(如:复杂的计算,音乐播放,下载等)。可以理解为是没有前台的Activity,适合用来运行不需要前台界面的代码,服务可以被手动关闭不会重启,但是如果被自动关闭,内存充足就会重启。
特点:无用户界面、在后台运行、生命周期长。
二、服务的分类:
1、按照使用范围分类:本地服务和远程服务。
(1)、本地服务:Local Service
优点:本地服务在一定程度上节约了资源,另外本地服务因为在同一个进程,因此不需要IPC,也不需要AIDL。相应BindService会方便很多。
缺点:主进程被Kill后,服务便会终止。
区别:本地服务依附在主进程上,而不是独立的进程,用于应用程序内部。
应用:音乐播放服务。
(2)、远程服务:Remote Service
优点:对应进程名格式为所在包名加上指定的android:process字符串。由于是独立的进程,因此在Activity所在进程被Kill的时候,该服务依然在运行,不受其他进程影响,有利于为多个进程提供服务,具有较高的灵活性。
缺点:会占用一定的资源,并且使用AILD进行IPC稍微麻烦一点。
区别:远程服务是独立的进程,用于android系统内部的应用程序之间,可被其他应用程序复用。
应用:提供天气状况、时间日历的系统服务,这种Service是常驻的。
2、按运行类型分类:前台服务和后台服务
(1)、前台服务:
区别:会在通知栏显示正在运行的Notification
应用:当服务被终止的时候,通知一栏的Notification也会消失,对用户有一定的通知作用,如音乐播放服务。
服务是在调用 startForeground(android 2.0 及其以后版本)使服务成为前台服务。这样做的好处在于,当服务被外部强制终止掉的时候,ONGOING 的 Notification 会被移除掉。
(2)、后台服务:
区别:默认的后台服务,没有Notification。
应用:某些不需要提示的服务运行或终止时,用户看不到效果,如天气更新,日期同步,邮件同步等。
3、按照使用方法分类:启动型和绑定型
(1)、startService(启动型服务):当应用程序组件(如Activity)调用startService()方法启动时,服务处于started状态。
区别:是由其他组件(如Activity)调用startService()启动的,这导致服务的onStartCommand()方法被调用。当服务是started状态时,其生命周期与启动它的组件无关。并且可以在后台无限期运行,即使启动服务的组件已经被销毁,因此服务需要在完成任务后调用stopService(),或者由其他组件调用stopService()方法停止。
(2)、bindService(绑定型服务器):当应用程序组件调用bindService()方法绑定到服务时,服务处于bound状态。
区别:使用bindService()方法启用服务,调用者与服务绑定在了一起,调用者一旦退出,服务也就终止了,大有“不求同时生,必须同时死”的特点。
4、注册:和Activity一样,应用中的每个service在使用前都需要在清单文件中进行注册,否则应用不识别。
5、Service与Thread的区别。
Service与Thread无任何关系。之所以有不少人把他们联系起来,主要是因为Service的后台概念。
后台:后台任务运行完全不依赖UI,即使Activity被销毁/程序被关闭,只要进程还在,后台任务就可以继续运行。
二者的异同。
Service:
作用:执行异步操作。
运行线程:主线程(不能处理耗时操作,否则会出现ANR)
运行范围:完全不依赖UI/Activity,只要进程还在,Service就可以继续运行
所有Activity都可与Service关联,获得Binder实例&操作其中的方法。
若需处理耗时操作,则在Service里创建Therad子线程执行。
Thread:
作用:执行异步操作。
运行线程:工作线程。
运行范围:即依赖于某个Activity
在一个Activity中创建的子线程,另一个Activity无法对其进行操作。
在Activity很难控制Thread
当Activity被销毁后,就无法在获取到之前创建的子线程实例。