为什么需要混合使用
根据上篇提到了Service的各种生命周期,我们知道startService开启后与调用者毫无关联,不会随着调用者的销毁而销毁。bindService可以与调用者绑定实现一些交互,但是与调用者共生死。
所以需要两者结合使用发挥各自的有点,即又能提供与调用者的交互,又不会与调用者一起销毁的服务
不同开启方式的生命周期
startService & stopService
onCreate – onStartCommand – onDestroy
不会随着调用者销毁
bindService & unbindService
onCreate – onBind – onUnbind – onDestroy
会随着调用者销毁
startService bindService & unbindServiced stopService
onCreate – onStartCommand – onBind – onUnbind–onDestroy
开始按钮点击事件运行startService,bindService开启服务,
结束按钮点击事件运行unbindServiced,stopService结束服务
startService bindSErvice & 销毁调用者
onCreate – onStartCommand – onBind – onUnbind(调用者销毁时)-- onDestroy(后台持续运行,直到被系统回收或者用户强制销毁服务)
服务开始
调用者销毁后,服务解绑,未销毁。
bindService startService & unbindService stopService
onCreate – onBind – onStartCommand – onUnbind – onDestroy
bindService先运行,onBind将先与onStartCommand执行
点击结束按钮执行unbindService,stopService,正常销毁服务。
bindService startService & 销毁调用者
onCreate – onBind – onStartCommand – onUnbind (销毁调用者时)-- onDestroy(后台持续运行,直到被系统回收或者用户强制销毁服务)
服务开始的生命周期同上
结束的生命周期与上不同的是onDestroy是在调用者销毁之后由于其他原因销毁。
以上bindService与startService同时执行创建的是同一个Service实例,因为onCreate只执行了一次。
代码基本采用上一篇Service生命周期与开启方式
布局上添加了一个button用于销毁当前Activity,可以模拟调用者的销毁,主要修改如下
stopBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
unbindService(myConnection);
stopService(serviceOne);
}
});
startBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
bindService(serviceOne,myConnection,BIND_AUTO_CREATE);
startService(serviceOne);
}
});
END
用bindService+startService的方式可以同时享受两者的优点,可以持久后台运行并且可以通过调用者操作Service。
转载:https://blog.csdn.net/qq_28837549/article/details/106101873