为了更好地了接服务Service的生命周期,采用暴力测试,一下会多次启动服务,绑定服务,不按常理走!
1个服务==>CoreService
2个活动==> FirstActivity和SecondActivity
测试1: 先启动,再绑定
启动FirstActivity
第1步:startService
第2步:bindService
第3步:多次bindService
多次绑定服务,没有打印,说明生命周期没走
第4步:多次startService
可以看到多次启动服务,只执行onStartCommand和onStart方法,注意startId是自增的!
点击跳转启动SecondActivity
第5步:,执行startService
第6步:bindService
如果已经Activity有绑定过了(未解绑),其它Activity在绑定只会执行onServiceConnected
第7步:退出SecondActivity
@Override
protected void onDestroy() {
super.onDestroy();
unbindService(conn);
}
退出时,解除绑定,没有打印,说明没有触发onServiceDisconnected
第7步:退出FirstActivity(第一个绑定的)
同样unbindService(conn)解除绑定
测试2: 先绑定,再启动
启动FirstActivity
第1步:bindService
第2步:startService
第3步:多次bindService
多次绑定服务,没有打印,说明生命周期没走
第4步: 同测试1#
点击跳转启动SecondActivity
第5步:同测试1#
第6步:同测试1#
第7步:退出FirstActivity(第一个绑定的)
同样unbindService(conn)解除绑定
这一步跟测试1是同样的结果,但是如果只有绑定而从没启动过服务,那结果还是一样吗?那放到测试3吧!
如果你绑定了服务,但是Activity退出的时候却没有unbindService,那么会抛个异常:
E/ActivityThread: Activity shone.mpchart.SecondActivity has leaked ServiceConnection shone.mpchart.SecondActivity$1@3a0389e1 that was originally bound here
android.app.ServiceConnectionLeaked: Activity shone.mpchart.SecondActivity has leaked ServiceConnection shone.mpchart.SecondActivity$1@3a0389e1 that was originally bound here
...
测试3: 只绑定,不启动
启动FirstActivity
第1步:bindService
第2步:退出,unbindService
所以跟测试1#比较,发现先绑定,如果后面再startService,那么unbindService的时候,不会触发onDestroy
测试4: 不管先绑定,再启动或者先启动,再绑定
这种是特殊情况
中间加入一个停止服务的步骤
mService.stopService(new Intent(FirstActivity.this, CoreService.class));
调了停止方法,服务却没有走任何生命周期,但是退出的时候
这里跟测试1#和测试2#对比一下,仅仅调了一下stopService,则退出的时候,解除绑定同样会服务退出!