在Android开发的过程中,Service是一个非常重要的组件。
它的生命周期里面有几个特别重要的方法。
- Service的生命周期
onCreate 当服务创建的时候调用
onStartCommand startServcie的时候会调用这个方法
onBind 当有其他组件想通过bindService()方法绑定这个服务时系统就会调用此方法。在实现的方法里面,必须添加一个供客户端使用的接口通过返回IBinder来与服务通信,这个方法必须实现。当然想禁止绑定的话,返回null即可。
onDestory()
服务不再使用则调用该方法。服务应该事先这个方法来清理诸如线程,注册的监听器等资源。这是最后调用的方法。
- 服务启动的两种方式
启动Service有两种方式:1.startService 2.bindService
这两种启动方式,一种是需要跟生命周期绑定,
如果同时以两种方式来启动service,会走service生命周期的哪些方法?
1.startservice启动后,service会一直在后台运行,直到主动调用stopservice函数。
2.bindservice启动后,service在绑定的activity摧毁以后会自动停止。
- 如果以两种方式启动同一个服务会怎样?
我们用实际例子验证下,首先新建一个Activity,上面放置四个按钮,分别对应startservice,bindservice,unbindservice,stopservice四个函数。具体代码如下:
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.button:
Intent intent = new Intent(v.getContext(),MyService.class);
startService(intent);
break;
case R.id.button2:
Intent intent2 = new Intent(v.getContext(), MyService.class);
bindService(intent2, conn, Context.BIND_AUTO_CREATE);
break;
case R.id.button3:
unbindService(conn);
break;
case R.id.button4:
Intent intent3 = new Intent(v.getContext(),MyService.class );
stopService(intent3);
break;
}
}
首先,我们点击startservice
再点击onbind的时候,执行onbind方法。
这时候我们就算再次绑定服务,还是只会执行一次onbind方法。
好了,现在这个服务不想要了。
我们点击 unbindservice取消绑定服务。这时候只执行了onUnbind函数。但是没有执行onDestory。说明服务还没有销毁掉。
这时候我们点击StopService。日志上显示onDestroy。说明这时候服务才被销毁。
总结:当开启一个服务后,然后绑定一个服务后,就算取消绑定了,那个服务也还会在,直到我们调用了stopservice。
再来。
先点击绑定服务。这时候日志上显示
31898/service.example.com.servicedemo D/TAG: OnCreate
31898/service.example.com.servicedemo D/TAG: onBin
d
这次我们先执行的是bindService,然后执行startService
这时候日志里面执行了onstartcommand onstat
t
然后如果想关掉这个服务我执行stopservice,然后没看见打印任何东西,这时候我执行unbindservice,然后输出onunbind ondestryy
y
通过以上的实验证明,一个服务如果如果通过两种不同的启动方法,那么在它还有绑定的activity的时候,就算执行了stopservice,它也不会被关闭。 相对的,一个通过startservice启动的服务,然后绑定了服务的同时i,就算执行了unbindservice,它也还未被关闭,只有执行了stopservice后才能销毁。这就是用两种方式启动service后,service的生命周期。
附上我的代码地址:
https://github.com/preqel/ServiceDemo