先谈谈Android四大组件
Service是Android系统中的四大组件之一,它是一种长生命周期的,没有可视化界面,运行于后台的一种服务程序。Service必须在AndroidManifest.xml中声明。Service有自己的声明周期,可以使用startService启动一个Service或使用bindServcie()方法绑定一个已经存在的Service。
Service的生命周期没有Activity那么复杂,它只继承了onCreate,onStart(),onDestroy()三个方法,当第一次启动Service时,先后调用了onCreate(),onStart()这两个方法,当停止Service时,则执行onDestroy方法,这里需要注意的是,如果Service已经启动了,当我们再次启动Service时,不会再执行onCreate方法,而是直接执行onStart()方法。
Service的启动方法
Service的有两种启动方式:Context.startService()和Context.bindService(),这两种方式对Service生命周期的影响是不同的。
1,Context.startService()方式启动
Context.startService()方式的生命周期
启动时:startService------------->onCreate()-------------------->onStart()
停止时:stopServcie-------------->onDestroy()
如果调用者直接退出而没有停止Service,则Service会一直会在后台运行
Context.startService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用onStarte()方法。
如果调用startService()方法前服务已经被创建,多次调用startService()方法并不会导致多次创建服务,但会导致多次调用onStart()方法。采用startService()方法启动的服务,只能调用Context.stopService()方法结束服务,服务结束时会调用onDestroy()方法。
代码如下:
Intent intent=new Intent();
Intent.setAction("com.my.action.My_SERVICE");
//启动服务 startService(intent);
//停止一个Service stopService(intent);
2.Context.bindService()方式启动:
Context.bindService()方式的生命周期:
绑定时:bingService()---------->onCreate()------------------>onBind()
调用者退出了,即解绑定时:
Service就会unbindService()------------------->onUnbind()--------------------->onDestroy()
用Context.bindService()方法启动服务,在服务未被创建时,系统就会先调用服务的onCreate()方法,接着调用onBind()方法
。这个时候调用者和服务绑定在一起。
调用者退出了,系统就会调用服务的onUnbind()方法,接着调用onDestroy()方法。如果调用bindService()方法前服务已经被绑定,多次调用用bindService()
方法并不会导致多次创建服务及绑定(也就是说onCreate()和onBind()方法不会被多次调用)。
如果调用希望与正在绑定的服务解除绑定,可以调用unbindService()方法,调用该方法也会导致系统调用服务的onUnbind()------>onDestroy()方法。
绑定Service需要三个参数:bindService(intent,conn,Servcie.BIND_AUTO_CREATE)
第一个:Intent对象
第二个:ServiceConnection对象,创建该对象要实现它的onServiceConnected()和onServiceDisconnected()来监听Service连接和断开消息。
//连接对象
ServiceConnection conn=new ServiceConnncetion(){
//连接调用
public void onServiceConnected(ComponentName name,IBinder service){
Log.i("Service",“连接成功”);
}
//断开时调用
public void onServiceDisconnectied(ComponentName name){
Log.i("Services","断开连接");
}
}
第三个:创建Service方法,一般指定绑定的时候自动创建
理解Service生命周期视图:
Service使用需要注意的问题:
1,ServiceConnection的回调方法onServiceDisconnected()在连接正常关闭的情况下是不会被调用的,该
方法只在Service被破坏了或者被杀死的时候调用。例如,系统资源不足,要关闭一些Service,刚好连接绑定
的Service是关闭者之一,这个时候onServiceDisconected()就会被调用。
2,如果Service和调用者不是在同一个进程,则不可以在ServiceConnection的回调方法onServiceConnected中
将Service强制类型转换,在Debug中可以发现onServiceConnected的Service的类型为BinderProxy.