Android service生命周期及各种回调实测

1. 也就是说,他有两种启动方式
startService:onCreate()- >onStartCommand()->startService()->onDestroy()
BindService:onCreate()->onBind()->onUnbind()->onDestroy()

startService的启动方式:
这种启动方式和启动activity很相像:
Intent intent = new Intent(this, MyService.class);
startService(intent);
在使用这种方式启动服务之后,此服务就会一直在后台运行,不受启动它的activity的生命周期的影响,除非我们在 service 的任何一个位置调用它的 stopService()方法;或者程序被杀死/结束,此service才会被停止

BindService的启动方式:
Intent bindIntent = new Intent(this, MyService.class);//Myservice是子定义的service,继承了service类
bindService(bindIntent, connection, BIND_AUTO_CREATE);//第一个参数就是intent,第二个参数是ServiceConnection,第三个参数是一个标志位,这里传入 BIND_AUTO_CREATE 表示在活动和服务进行绑定后自动创建服务。
它区别于startService的启动,他的生命周期是和启动它的acitvity(活动)是紧密相关的,也就是说,如果你在A活动里用bindService的方式启动了一个Serivce,那么如果这个activity被销毁,则此service也就会被终止。那如果我们想自己解除活动和服务之间的绑定该怎么办呢?调用一下 unbindService()方法就会调用onUnbind()和onDestroy()了。

  • 如果同时用着两种方式启动,那该怎么销毁呢,是用stopService,还是用unbindService?
    根据Android的系统机制,如果你同时用着两种方式启动、绑定了一个service,那么他就会一直处于运行状态,所以必须要以上两种状态同时不满足,也就是要同时调用stopService和unbindService,onDestroy()方法才能执行

3. 当一个Service被创建以后,再次调用startService方法,Service是不会被重新创建的,而是会重新执行onStartCommand方法。

BindService一旦被某个activity调用,onbind、 onServiceConnected和doTask就会被调用,且在被此activity绑定的状态下此activity再次调用BindService不会产生变化。(当所有绑定此service的activity都解绑了,调用onDestroy()才会成功,否则会报错)

onStartCommand属于Service类,doTask属于Service的内部Binder类,onServiceConnected属于activity的内部ServiceConnection类

由此可见onStartCommand是Service自己的服务内容,doTask是属于和activity有联系的Service服务内容,ServiceConnection是activity在绑定成功时自己的动作内容。

posted @ 2022-08-12 00:50  小汀  阅读(292)  评论(0编辑  收藏  举报