Service是和Activity最相似的一个组件,只不过Activity运行在前台,有用户界面,和用户之间有交互,而Service运行在后台,无法和用户之间进行交互;Service也有自己的生命周期,并且和Activity一样都需要在android的清单文件中配置。
可以通过两种方式来启动Service,分别如下:
1:startService()
(1): 通过该方式启动的Service和启动者之间没有关系,被启动的Service就像“脱缰的野马”,即使启动者退出了,被启动的Service还会继续运行。
(2):启动者启动Service时startService(intent),可以通过Intent给Service传递数据,但是除此之外,启动者和Service之间无法再进行通信。
(3):通过该方式启动的Service可以自杀stopSelf(),也可以被启动者杀死stopService(intent)。
2:bindService()
(1):通过该方式启动的Service和启动者绑定到一起了,如果启动者退出,则被启动的Service也会终止。
(2):启动者不仅在启动Service时bindService(intent,ServiceConnection,flags),可以通过Intent给Service传递数据,而且还可以通过ServiceConnection对象的onServiceConnected方法的参数进行通信。就相当于在启动者中,可以拿到Service的引用或Service中某对象的引用,这样以来就可以在启动者中去访问Service中的方法。
(3):启动者退出,被启动的Service终止;Service可以自杀stopSelf(),也可以被启动者解除绑定unbindService(connection)后而终止。
Service和Activity一样都不能直接处理耗时操作,否则会引发ANR异常;只能通过启动子线程的方式,来让子线程去完成耗时操作。
如果我们启动一个Service,并让这个Service启动子线程,目的仅仅是为了完成一个耗时操作,那么没必要继承普通Service,并手动创建一个子线程 ;直接继承IntentService,重写OnHandleIntent()方法即可。
IntentService在接收到Intent请求时,会将其加入队列中,并自动创建一个子线程来依次处理Intent请求,执行onHandleIntent方法中的操作,开发者无须再处理多线程问题;当所有Intent请求处理完毕后,IntentService会自动终止。
我个人觉得IntentService就是为了处理耗时操作的。