安卓服务——bind service一个绑定式的服务

绑定式服务的介绍

学习笔记,欢迎指导。

△绑定式的服务定义:一个由bindService()方法所开启的服务成为绑定式的服务。

    →其他组件可以与该服务绑定,同时可以与他进行通信(包括向服务发送请求,接收服务所返回的和数据,你还可以通过这个服务进行进程间的通信)。

    →一个绑定式的服务不可以在后台无限期地执行,当所有与他相绑定的组件都与他解绑,这个服务就会销毁(当不再有组件与他绑定,系统会自动将干掉他)。


△绑定式服务的基础知识

    →他是Service的子类,开发者要覆写onBind()方法,这个方法返回一个IBinder对象,这个对象里面定义一个公有方法,与服务绑定的组件通过该方法与服务进行通信。

    →客户端(客户端就是想要与服务相绑定的那个组件)通过方法:bindService与服务绑定。

    →一个服务可以在同一个时间与多个客户端绑定,系统会向每一个与服务绑定的客户端传第一个:IBinder对象,但是,只有第一个与服务想绑定的客户端的IBinder对象是通过onBind方法返回的,其他与服务绑定的客户端的IBinder对象不是通过onBind方法返回。即onbind()方法只会调用一次。

    →当最后一个与服务相绑定的客户端也解绑定了,系统将会销毁服务。


△创建一个绑定式的服务

    →当你的服务工作于不同场合(工作于一个应用的内部;工作于不同的进程之间),使用不同创建方法。本文只是讲述作用于单一应用内部的服务。

    →当服务只是工作在自己应用内部,方法如下:在你的服务类内部,定义一个内部类去继承Binder(),然后,在onBind方法里,返回一个该内部类实例。


△具体步骤:

    →首先,绑定服务的本质是,在窗体那获取服务实例,然后就能直接调用服务里的公有方法(这有点类似于Fragment与窗体通信的做法)。

    →在服务里完成步骤:

    (1定义一个内部类继承Binder类,该内部类里面定义一个共有方法,该方法将当前服务实例返回。

    (2)在服务的onBind方法里面,将该内部类的实例返回。看代码

    

public class MService extends Service {
        //创建一个内部类的实例
        private MyBinder myBinder = new MyBinder();

        public void onCreate() {
            super.onCreate();
            Log.i("test", "--onCreate--");
        }
        
        //第一步:定义一个类去继承Binder
        public class MyBinder extends Binder{
            //内部类里定义一个公有方法
            public MService getService(){
                return MService.this;//将当前服务的实例返回
            }
        }
 
        //第二步:在服务的onBind方法里面
        //将该内部类的实例返回
        @Override
        public IBinder onBind(Intent intent) {
            Log.i("test", "--onBind--");
            return myBinder;
        }
    }

 

    →在客户端(我这里将窗体做客户端)完成步骤:

    (1)定义一个内部类,该内部类实现接口”ServiceConnection”,同时实现接口里的两个方法:”onServiceConnection”(客户端在这个方法方法体里得到Binder对象,由该对象就能得到服务实例)、”onServiceDisConnection”(当服务被意外断开,系统将会回调这个方法)。

 

    (2)分别创建服务类变量、内部类变量(内部类变量需要实例化),在”onServiceConnection”方法里面用得到的服务实例将服务类变量实例化

 

    (3)在需要绑定服务的地方,调用bindService()方法,将内部类变量传入。

    看代码:代码注释已经写好代码编写时的顺序,这个顺序只是便于理解而已。

public class MainActivity extends Activity implements View.OnClickListener {
    //第二步:创建内部类变量以及服务类的变量
    //同时实例化内部类变量
    private MService mService = null;  
    private MServiceConnection mServiceConnection = 
    new MServiceConnection();
 
    //窗体的初始化方法
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        findViewById(R.id.bt_bind_the_service)
         .setOnClickListener(this);      
    }
    //点击事件响应函数
    @Override
    public void onClick(View v) {

        switch (v.getId()){
            case R.id.bt_bind_the_service:
                Intent intent =
             new Intent(MainActivity.this, MService.class);
                //第三步:绑定服务那个时候将接口的实例传入
                bindService(intent, mServiceConnection,
                  Context.BIND_AUTO_CREATE);
                break;
        }
    }

    //第一步:定义一个内部类去实现接口”ServiceConnection”

    class MServiceConnection implements ServiceConnection{
        //这个方法里面那个service
        //就是服务类里面的onBind()方法所返回的IBinder变量了
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
        //还是第二步:将服务类的变量实例化:
            //将IBinder向下转型
            MService.MyBinder myBinder = (MService.MyBinder)service;
            //调用公有方法就能获得服务类的实例
            mService = myBinder.getService();
            Log.i("test","连接服务");
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            Log.i("test", "意外断开");
        }
    }

}



    →总结一下做了什么:

    在服务里,继承Binder同时定义公有方法,通过onBind()方法将服务类实例传递给客户端。

    在客户端,通过bindService()绑定服务,同时通过”ServiceConnection”接口里的”onServiceConnection”方法获取服务实例。

 

注意:你最好定义一个布尔型变量,每次绑定服务或者解绑定时都要修改这个标记。



你可能感兴趣的:(Android基础)