美文网首页
Service与Bind Service

Service与Bind Service

作者: BlackL | 来源:发表于2016-02-28 21:27 被阅读0次

    通过startService()bindService()两种方式启动的Service的生命周期

    <br />


    可以看到普通Service是通过startService()来启动的,而bind service则是通过在相应组件中调用onBind()方法来与service绑定(四大组件中唯有Broadcast Receiver无法与service绑定)。
    要注意的是service默认情况下是在UI线程中运行的,所以当要在service中进行阻塞型操作时最好在service中单独开一个线程。

    如上图所示,通过startService()启动的service会在onCreate()方法之后调用onStartCommand()方法,而通过此方法启动的service没有与组件绑定,该service应在完成任务时自己调用stopSelf()方法,或在其他组件中调用stopService()方法。
    而通过onBind()方法启动的service则会在onCreate()方法之后调用onBind()方法,该方法会返回一个Binder对象,与该service绑定的组件一般是通过返回的这个Binder对象进行与service之间的通信。当所有绑定与该service的组件分别都调用unBindService()时,该service便会被销毁。
    <br />
    <br />

    bind service

    <br />
    在组件中调用onBind()方法时需要传入一个ServiceConnection对象。

    private ServiceConnection mConnection = new ServiceConnection() {
        public void onServiceConnected(ComponentName className, IBinder service) {
            // This is called when the connection with the service has been
            // established, giving us the object we can use to
            // interact with the service.  We are communicating with the
            // service using a Messenger, so here we get a client-side
            // representation of that from the raw IBinder object.
        }
    
        public void onServiceDisconnected(ComponentName className) {
            // This is called when the connection with the service has been
            // unexpectedly disconnected -- that is, its process crashed.
        }
    };
    

    可以看到onServiceConnected()方法中有一个IBinder对象,这个IBinder对象即为Service中onBind()方法返回的对象(IBinder为一个接口,Binder实现了个这个接口)。同样可以看到onServiceDisconnected()方法中的注释,这个方法只有在非正常情况下service与组件连接中断时才会调用。

    注意:

    • 当你的activity需要在可见时才需要同service交互则需要在activity的onStart()中绑定service,并在onStop()方法中解除绑定。
    • 若当在activity在后台时仍需要与service交互,则需要在onCreate()方法中绑定,并在onDestory()方法中解除绑定。

    </br>

    startService()bindService()共同出现的情况

    </br>

    如上图,可以看到当所有与service绑定的组件都调用了unBind()方法时,若在这之后service调用stopSelf()或其他组件调用stopService()方法后service才会被销毁。这期间有别的组件重新调用onBind()方法,若该service的onUnbind()方法返回true则会调用onRebind()方法,若返回false则会直接调用onBind()方法。

    相关文章

      网友评论

          本文标题:Service与Bind Service

          本文链接:https://www.haomeiwen.com/subject/tvfgkttx.html