本地服务用于应用程序内部,可以实现应用程序自己的一些耗时任务,比如查询升级信息,网络传输,或者在一些场合需要在后台执行,比如播放音乐,并不占用应用程序比如activity所属的线程,而是单开线程后台执行,这样用户体验比较好。
一,本地服务的启动方式
1,Context.bindService
1,绑定时,bindService——onCreate()——onBind()
bindService(Intent intent,ServiceConnection conn,int flags)
参数说明:
1,intent:Intent对象,需要定义指向服务器
2,conn:ServiceConnection接口对象,创建该对象要实现它的onServiceConnected(系统调用该方法来传递由Service的onBind方法返回的IBinder)和onServiceDisconnected(对Service的连接意外丢失,比如当Service崩溃或者被杀时,系统会调用该方法)来判断连接成功或者是断开连接
3,bindService之后会自动调用ServiceConnection接口里面的onServiceConnected方法;但是如果执行unbindService方法之后不会自动调用这个接口里面的onServiceDisconnected方法,也就是说执行unbindService只是告诉系统已经和这个服务没有关系了,同时在系统内存不足的时候可以优先杀死这个服务。
注意:Service和需要绑定的Activity在一个包内,否则将无法调用ServiceConnection接口中的上述方法。
2,解除绑定时,unbindService——onUbind——onDestory
如果调用者(例如Activity)直接退出,Service由于与调用者绑定在一起,则Service会随着调用者一同停止。
用Context.bindService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate方法,接着调用onBind方法。这个时候调用者和服务绑定在一起,调用者退出了,系统就会调用服务的onUnbind方法,接着调用onDestroy方法。
如果调用bindService方法前服务已经被绑定,多次调用context.bindService方法并不会导致多次创建服务及绑定。
如果调用者希望与正在绑定的服务解除绑定,可以调用unbindService方法,调用该方法也会导致系统调用服务的onUnbind——onDestroy方法
2,Context.startService
1,启动时,startService——onCreate——onStart
2,停止时,stopService——onDestroy
此时如果调用者直接退出而没有停止Service,则Service会一直在后台运行。
Context.startService方法启动服务,在Service未被创建的时候,会先调用Service的onCreate方法,然后再调用OnStart方法.
采用StartService启动的服务,只能调用stopService方法结束服务,服务结束时候会调用onDestroy方法
二,生命周期
Service生命周期一般有两种运行模式。
1,通过Context.startService方法开始,以Context.stopService方法结束,
可以通过Service.stopSelf或者Service.stopSelfResult方法停止自身。stopService只需调用一次便可以将服务停止。
2,通过接口被外部程序调用。外部程序建立一个到Service的连接,通过这个连接来操作Service.创建连接开始于Context.bindService,结束于Context.unbindService多个客户端绑定到同一个Service。