飞道的博客

Android:Service开启之startService与bindService混合使用

635人阅读  评论(0)

为什么需要混合使用

根据上篇提到了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
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场