Android中的四大组件之-Service
Service 是一个可以在后台执行长时间运行操作而不提供用户界面的应用组件。服务可由其他应用组件启动,而且即使用户切换到其他应用,服务仍将在后台继续运行。 此外,组件可以绑定到服务,以与之进行交互,甚至是执行进程间通信 (IPC)。 例如,服务可以处理网络事务、播放音乐,执行文件 I/O 或与内容提供程序交互,而所有这一切均可在后台进行。
两种创建服务的方式:
继承Service:是所有服务的基类,当继承一个这个类时,处理耗时操作需要为服务创建新的线程。因为这些服务被默认用的是主线程。
继承IntentService:IntentService是继承于Service并处理异步请求的一个类,在IntentService内有一个工作线程来处理耗时操作,启动IntentService的方式和启动传统Service一样,同时,当任务执行完后,IntentService会自动停止,而不需要我们去手动控制。另外,可以启动IntentService多次,而每一个耗时操作会以工作队列的方式在IntentService的onHandleIntent回调方法中执行,并且,每次只会执行一个工作线程,执行完第一个再执行第二个,以此类推。
服务的启动:
启动(Started)服务:将一个服务通过Intent传给四大组件的startService()。android系统将能调用Service对象的onStartCommand()方法。
例如:
Intent intent =newIntent(this,HelloService.class);
startService(intent);
startService()方法启动服务时Android系统将会立即做出反应,它会调用服务的onstartCommand(),如果服务没有在运行它会先调用oncreate(),再调用onstartCommand()
如果你的服务没有提供binding,通过startService()传递的Intent是应用组件和服务之间的唯一通讯方式。如果你想服务能返回结果,客户端可以为一个广播创建一个PendingIntent,并将它传递到开始服务的Intent对象中,服务也能通过广播传递结果。当多个请求者启动同一个时,将会导致多次调用服务的onStartCommand()方法,但是当有一个请求者停止(stopSelf()或stopService())服务时,服务将会被停止。绑定(Bound)服务:一个绑定服务继承Service类,允许组件去绑定它,能向服务发送请求、服务能作出回复、并实现进程间的通信。你必须实现onbind()方法,这个方法返回一个IBinder对象,能与客户端进行通信。客户端能通过bindService来绑定服务,但是它必须提供一个ServiceConnection的实现类,来连接一个服务。bindService()不会立即返回值,但是系统会在服务和客户之间创建一个连接,系统会调用ServiceConnection对象的onServiceConnected()方法返回一个IBinder对象。当多个客户绑定同一个服务时,系统会将第一个返回的IBinder对象传递给多个客户端。当最后一个客户解绑服务时,系统会自动地销毁服务。
服务的停止:
一个启动的服务必须能管理自己的生命周期,这样,系统不需要停止或销毁服务,除非它是必须继续运行在onStartCommand()返回后,要恢复系统的记忆。所以一个服务必须通过stopSelf()停止自己,或是其他的控件通过stopService()停止服务。一旦一个服务被stopSelf()或stopService(),系统马上就会销毁服务。
服务的生命周期:
下图为官方文档中的服务生命周期变化图:
- 被启动的服务的生命周期:如果一个Service被某个Activity 调用 Context.startService 方法启动,那么不管是否有Activity使用bindService绑定或unbindService解除绑定到该Service,该Service都在后台运行。如果一个Service被startService 方法多次启动,那么onCreate方法只会调用一次,onStart将会被调用多次(对应调用startService的次数),并且系统只会创建Service的一个实例(因此你应该知道只需要一次stopService调用)。该Service将会一直在后台运行,而不管对应程序的Activity是否在运行,直到被调用stopService,或自身的stopSelf方法。当然如果系统资源不足,android系统也可能结束服务。
- 被绑定的服务的生命周期:如果一个Service被某个Activity 调用 Context.bindService 方法绑定启动,不管调用 bindService 调用几次,onCreate方法都只会调用一次,同时onStart方法始终不会被调用。当连接建立之后,Service将会一直运行,除非调用Context.unbindService 断开连接或者之前调用bindService 的 Context 不存在了(如Activity被finish的时候),系统将会自动停止Service,对应onDestroy将被调用。
- 被启动又被绑定的服务的生命周期:如果一个Service又被启动又被绑定,则该Service将会一直在后台运行。并且不管如何调用,onCreate始终只会调用一次,对应startService调用多少次,Service的onStart便会调用多少次。调用unbindService将不会停止Service,而必须调用 stopService 或 Service的 stopSelf 来停止服务。
- 当服务被停止时清除服务:当一个Service被终止(1、调用stopService;2、调用stopSelf;3、不再有绑定的连接(没有被启动))时,onDestroy方法将会被调用,在这里你应当做一些清除工作,如停止在Service中创建并运行的线程。
Service 与 Thread 的区别
Thread:Thread 是程序执行的最小单元,它是分配CPU的基本单位。可以用 Thread 来执行一些异步的操作。
Service:Service 是android的一种机制,当它运行的时候如果是Local Service,那么对应的 Service 是运行在主进程的 main 线程上的。如:onCreate,onStart 这些函数在被系统调用的时候都是在主进程的 main 线程上运行的。如果是Remote Service,那么对应的 Service 则是运行在独立进程的 main 线程上。
Service和Thread 可以说都是在后台,但是Service优先级高于Thread ,当系统的内存不足时,Thread 很容易被杀死。