android service 详解(生命周期、使用方法)
一、生命周期
service不同的启动方式、生命周期不同。service在client(例如activity、fragment)中使用startService(Intent intent)和bindService()启动,使用startService()的启动方式生命周期如图左边所示,两种启动方式有一定的区别,但是不管以那种方式启动service,只要不是初次启动这个服务,都不会在调用onCreate()方法,onCreate方法只用在初次启动是会被调用,在service生存期间只会调用一次(详细的解读可以参考文章 [https://blog.csdn.net/cpcpcp123/article/details/121961812]。
生命周期之startService
startService()启动,启动时可以通过Intent对象将参传到service,但是启动后服务与client之间没有关系,client无法去控制service(在不使用广播、以及其他通信机制的情况下),但是client可以通过stopService()以及方法停止服务。
生命周期之bindService
bindService()的启动方式比较麻烦,但是bindservice的启动方式可以获取service对象,从而直接控制service的行为,从而达到你想要的效果。bindservic的启动后,一旦client销毁,service也会解绑。同时可以通过unbindservice()方法解绑。
bindService的使用方法如下:
1、在service中定义继承了binder一个内部类,在该内部类中返回当前的service对象,这个的作用是为了帮助client获取到当前的service对象。
public class MyBinder extends Binder{
public MyService getService(){
return MyService.this;
}
}
在重写service的onBind()方法
@Override
public IBinder onBind(Intent intent) {
return mybinder;
}
2、
在client(activity)中实例化ServiceConnection接口的实现类,重写onServiceConnected()和onServiceDisconnected()方法。在绑定成功后onServiceConnected就会被回调,而且只会回调一次,也就是说你即使多次调用bindService,
onServiceConnected也只会执行一次,只有当unbindService后再次bindService,onServiceConnected才会又被调用一次 onService Disconnected这个只有在服务崩溃或被终止时才会被调用,unbindService是不会调用到onServiceDisconnected的onServiceConnected方法里的第二个参数就是我们在Service类里onBind方法返回的对象
ServiceConnection conn=new ServiceConnection(){
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//在activity绑定service是执行,主要是 通过这个方法获取onBind()中的返回值.
//但是也可以进行简单的逻辑处理
//向下转型,获取到service的引用。
myService = ((MyService.MyBinder) service).getService();
System.out.println("Service连接成功");
// 执行Service内部自己的方法
myService.excute();
}
@Override
public void onServiceDisconnected(ComponentName name) {
//绑定结束时会执行的操作
}
在使用bindService(Intent Intent,ServiceConnection con, int flags))开始服务,执行bindService()需要是三个参数,一个是intent,一个是ServiceConnection,第三个是一个flag,一般使用BIND_AUTO_CREATE。
service的使用总结
需要在清单xml中对service进行注册。