绑定服务的初步解读

来源:互联网 发布:淘宝卖教程选什么类目 编辑:程序博客网 时间:2024/05/19 11:49

        由于工作中很少用Service,所以对于service也只是初步了解,最近手头的项目基本进入收尾,所以有时间深入了解一下service.Service是四大组件之一,其重要性不言而喻,即使在面试中,也是面试官必问的问题。

       启动一个service有两种方式,一种利用StartService;一种是利用BundService的方式。第一种方式估计大多数人都很容易理解,所以这篇博客重头戏就是如何实现以绑定的形式启动一个Service。

     

When creating a service that provides binding, you must provide an IBinder that provides the programming interface that clients can use to interact with the service. 
   这是源于官网的一句话,大概意思就是如果我们想创建一个绑定服务,我们必须提供一个可以供客户端与服务端联系的提供运行接口的一个IBinder.官网指出,有三种方式可以定义一个这样的接口。

    第一种:继承Binder这个类 这种方式适合用于同一个应用程序里面;

    第二种:利用Messenger  该方式是最简单的IPC机制

    第三种:利用AIDL


第一种 继承Binder

MyService类

      

public class MyService extends Service {    //创建一个Binder的子类    public class MyBinder extends Binder{        //创建一个方法,该方法可以让外部类获取到该Service,然后就可以调用该Service下的方法        public MyService getService(){            return MyService.this;        }    }    public MyService() {    }    @Override    public IBinder onBind(Intent intent) {        return new MyBinder();    }    public void toast(){        Toast.makeText(MyService.this,"我可以操作service啦",Toast.LENGTH_LONG).show();    }
   MainActivity类

  

//必须实现ServiceConnectTion接口public class MainActivity extends AppCompatActivity implements View.OnClickListener, ServiceConnection {     private Button btn_bund_service,btn_un_bund_service,btn_operator;    //与Service相关     private  MyService myService;    //与MyBinder相关     private MyService.MyBinder myBinder;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initView();        setListeners();    }    private void initView() {        btn_bund_service = (Button) findViewById(R.id.btn_bund_service);        btn_un_bund_service = (Button) findViewById(R.id.btn_unbund_service);        btn_operator = (Button) findViewById(R.id.btn_operator_service);    }    private  void setListeners(){        btn_bund_service.setOnClickListener(this);        btn_un_bund_service.setOnClickListener(this);        btn_operator.setOnClickListener(this);    }    @Override    public void onClick(View v) {        Intent inttent = new Intent(MainActivity.this,MyService.class);        switch (v.getId()){            case R.id.btn_bund_service:                //绑定服务                bindService(inttent,this, Service.BIND_AUTO_CREATE);                break;            case R.id.btn_unbund_service:                //解绑服务                unbindService(this);                break;            case R.id.btn_operator_service:                if (myService !=null){                    myService.toast();                }                break;        }    }    @Override    public void onServiceConnected(ComponentName name, IBinder service) {        //获取MyBinder       myBinder = (MyService.MyBinder) service;        //获取Service对象        myService=myBinder.getService();    }    @Override    public void onServiceDisconnected(ComponentName name) {    }}
  简要理解一下:

   我们知道如果以绑定的方式启动一个Service的话,它的生命周期是onCreate()----->onBind,而OnBind()方法的返回值是一个IBinder,IBinder是一个接口,它的直接子类就是Binder。

   我们再看我们执行绑定服务的时候,里面有一个参数就是ServiceConnection。参看官方文档可以得知ServiceConnection是一个接口,该接口有两个抽象方法,一个是onServiceConnected,官方说明:Called when a connection to the Service has been established, with the IBinder of the communication channel to the Service.大概意思就是通过IBinder就可以和Service通信啦!


第二种:利用Messenger

  第一个程序里面的MyService类

    

public class MyService extends Service {    static final int MSG_SAY_HELLO = 1;    //消息的处理    private class Myhandler extends Handler {        @Override        public void handleMessage(Message msg) {            super.handleMessage(msg);            switch (msg.what){                case MSG_SAY_HELLO:                    Toast.makeText(MyService.this,"绑定成功",Toast.LENGTH_LONG).show();                    break;            }        }    };    private Messenger messenger=new Messenger(new Myhandler());    public MyService() {    }    @Override    public IBinder onBind(Intent intent) {        return messenger.getBinder();    }    @Override    public void onCreate() {        super.onCreate();        Log.d("Bund", "onCreate: ");    }}
   第二个程序里面的MainActivity,主要操作第一个程序里面的Service

    

public class MainActivity extends Activity implements View.OnClickListener, ServiceConnection {    private Button btn_bund,btn_unbund,btn_commumicate_service;    private Intent intent;    private Messenger messenger;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.content_main);        initView();        setListeners();    }    private void initView() {        btn_bund=(Button)findViewById(R.id.btn_bund);        btn_unbund=(Button)findViewById(R.id.btn_unbund);        btn_commumicate_service = (Button) findViewById(R.id.btn_conmiunicate_with_messenger);    }    private void setListeners() {        btn_bund.setOnClickListener(this);        btn_unbund.setOnClickListener(this);        btn_commumicate_service.setOnClickListener(this);    }    @Override    public void onClick(View view) {        intent = new Intent();        intent.setComponent(new ComponentName("com.boundserviceusemessenger","com.boundserviceusemessenger.MyService"));        switch (view.getId()){            case R.id.btn_bund:                bindService(intent,this, Service.BIND_AUTO_CREATE);                break;            case R.id.btn_unbund:                unbindService(this);                break;            case R.id.btn_conmiunicate_with_messenger:                if (messenger !=null){                    try {                        Message message = Message.obtain();                        message.what=1;                        messenger.send(message);                    } catch (RemoteException e) {                        e.printStackTrace();                    }                }                break;        }    }    @Override    public void onServiceConnected(ComponentName componentName, IBinder iBinder) {        messenger=new Messenger(iBinder);    }    @Override    public void onServiceDisconnected(ComponentName componentName) {    }}
     简要理解一下:

     首先该方式的重点就是Messenger,那接下来我们到官方文档了解一下该类。

     该类的构造方法有两种:

     Messenger(Handler target),该构造方法是我们在MyService里面使用的,来实例化的。

    Messenger(IBinder target),该构造方法是我们在MainAcyivity里面实例化Messenger对象的


   该类两个重要的方法:

   getBinder(),其返回值是IBinder

   send(Message message),该方法用于发送消息,就是与Service通信的核心。


  第三种:AIDL方式实现IPC

   在两个程序中创建包名和类名都相同的aidl接口,这一点很重要。

     

interface IMyAidlInterface {    /**     * Demonstrates some basic types that you can use as parameters     * and return values in AIDL.     */    void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,            double aDouble, String aString);    void setDataChange(String data);}

   第一个程序的MyService类:

      

public class MyService extends Service {    public MyService() {    }    @Override    public IBinder onBind(Intent intent) {        return new IMyAidlInterface.Stub() {            @Override            public void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString) throws RemoteException {            }            @Override            public void setDataChange(String data) throws RemoteException {            }        };    }    @Override    public void onCreate() {        super.onCreate();        Log.d("Test", "onCreate: ");    }    @Override    public int onStartCommand(Intent intent, int flags, int startId) {        return super.onStartCommand(intent, flags, startId);    }    @Override    public void onDestroy() {        super.onDestroy();        Log.d("Test", "onDestroy: ");    }}
   第二个程序的MyService类:

public class MyService extends Service {    public MyService() {    }    @Override    public IBinder onBind(Intent intent) {        return new IMyAidlInterface.Stub() {            @Override            public void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString) throws RemoteException {            }            @Override            public void setDataChange(String data) throws RemoteException {            }        };    }    @Override    public void onCreate() {        super.onCreate();        Log.d("Test", "onCreate: ");    }    @Override    public int onStartCommand(Intent intent, int flags, int startId) {        return super.onStartCommand(intent, flags, startId);    }    @Override    public void onDestroy() {        super.onDestroy();        Log.d("Test", "onDestroy: ");    }}
     第二个程序的MainAcyivity类:

        

public class MainActivity extends Activity implements View.OnClickListener, ServiceConnection {    private Button btn_bund,btn_unbund,btn_commumicate_service;    private Intent intent;    private IMyAidlInterface iMyAidlInterface;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.content_main);        initView();        setListeners();    }    private void initView() {        btn_bund=(Button)findViewById(R.id.btn_bund);        btn_unbund=(Button)findViewById(R.id.btn_unbund);        btn_commumicate_service = (Button) findViewById(R.id.btn_conmiunicate_with_aidl);    }    private void setListeners() {        btn_bund.setOnClickListener(this);        btn_unbund.setOnClickListener(this);        btn_commumicate_service.setOnClickListener(this);    }    @Override    public void onClick(View view) {        intent = new Intent();        intent.setComponent(new ComponentName("com.taolv365","com.taolv365.MyService"));        switch (view.getId()){            case R.id.btn_bund:                bindService(intent,this, Service.BIND_AUTO_CREATE);                break;            case R.id.btn_unbund:                unbindService(this);                break;            case R.id.btn_conmiunicate_with_aidl:                if (iMyAidlInterface !=null){                    try {                        iMyAidlInterface.setDataChange("通信成功");                    } catch (RemoteException e) {                        e.printStackTrace();                    }                }                break;        }    }    @Override    public void onServiceConnected(ComponentName componentName, IBinder iBinder) {      iMyAidlInterface=IMyAidlInterface.Stub.asInterface(iBinder);    }    @Override    public void onServiceDisconnected(ComponentName componentName) {    }}
到此为止,跟着官方代码理解如此,欢迎指点更正。


0 0
原创粉丝点击