Android Service :利用Binder实现通信

Android Service :利用Binder实现通信

AIDL是什么

AIDL是Android Interface Definition Language, 即Android接口定义语言。

Android通过AIDL文件,把Service的接口公布出来,以便Client可以通过接口和Service进行通信

如何利用Binder现实Service、Client通信

之前打过比喻,Service好比是一个岛,Client是大陆,岛(Service)和大陆(Client)的通信,是通过桥梁(Binder)实现的。

那么是怎么通过Binder来实现Service和Client之间的通信呢?

  1. 建造桥梁,建立aidl文件,将Service接口公布出来;
  2. 将桥梁架设在岛上,在Service端,实现aidl的接口,并返回Binder;
  3. 将桥梁架设在大陆上,在Client端,绑定Service,通过返回的Binder获得Service。;

通过上面的三步,就将桥梁(Binder)架设在岛(Service)和大陆(Client)之间,二者就可以通信了。

利用Binder进行Service、Client通信

通过上面知道,利用Binder实现Service、Cilent通信,基本上分三步:

  1. 新建一个AIDL文件,定义Serivce需要对外公布的接口;
  2. 在Service端,实现AIDL的接口,并在被绑定的时候返回Binder;
  3. 在Client端,绑定Service,在成功绑定之后,通过返回的Binder获得Service;

下面通过一个例子来看看是怎么通过Binder进行Service和Client通信的。

AIDL代码

package com.example.aidltestservice;
interface IAIDLTestService{
    void sayHello();
}

在此AIDL中,定义了接口sayHello();

Service代码

package com.example.aidltestservice;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;

public class AIDLTestService extends Service {

    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        //被绑定时,返回Binder,以供Client使用
        return mBinder;
    }

    //实现AIDL中定义的接口
    private final IAIDLTestService.Stub mBinder = new IAIDLTestService.Stub() {
        @Override
        public void sayHello() throws RemoteException {
            // TODO Auto-generated method stub
            Log.e("vqx376","say Hello");
        }
    };
}

Client代码

package com.example.aidltestclient;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.view.View;
import android.widget.Button;

import com.example.aidltestservice.IAIDLTestService;

public class MainActivity extends Activity {
    private Button mBtn;
    private IAIDLTestService mService;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init();
    }

    private void init(){
        mBtn = (Button) findViewById(R.id.btn);
        mBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //调用Service的方法,sayHello()
                //首先判断获得的Service是否为空,
                try {
                    if(mServie == null){
                        return;
                    }
                    mService.sayHello();
                } catch (RemoteException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        });

        Intent intent = new Intent();
        intent.setAction("com.aidl.demo");
        intent.setPackage(getPackagName());
        startService(intent);
        //绑定Service
        bindService(intent, mConnection, BIND_AUTO_CREATE);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unbindService(mConnection);
        mConnection = null;
    }

    //Service绑定的Callback
    private ServiceConnection mConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            //Service绑定成功
            //通过传入的Binder(Service返回的Binder),获得Service
            mService = IAIDLTestService.Stub.asInterface(service);
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            mService = null;
        }
    };
}

你可能感兴趣的:(Android,Service)