Android:AIDL简单使用

A I D L \color{#FF3030}{AIDL} AIDL
全称:(Android Interface Definition Language)android接口定义语言

应用场景:只有在需要不同应用的客户端通过 IPC(Inter-Process Communication:进程通信) 方式访问服务,并且希望在服务中进行多线程处理时,您才有必要使用 AIDL。官方文档

我与AIDl的相识源于一次尴尬的电话面试(两年前),对,没错就是空气突然的安静。。。我只能说出他的全称,在此之前我完全没有用到过,这是什么鬼东西,当安静下来查看相关文档发现AIDL的使用还是很简单的。

下面将以一个demo的方式来看他是如何使用的。
1.新建一个android工程(服务端),并在main路径下新建一个aidl文件,as会自动创建一个aidl路径
Android:AIDL简单使用_第1张图片
如文件:IAddInterface.aidl

package com.example.com.myAIDL;

// Declare any non-default types here with import statements

interface IAddInterface{
    /**
     * Demonstrates some basic types that you can use as parameters
     * and return values in AIDL.
     * 支持java中的基础类型,short类型除外
     * 以及List和Map,其中T为以上的基础类型,或实现了Parcelable 接口的自定义类型
     */
    void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,
            double aDouble, String aString);

     //这是我们自己写的方法,目的是从客户端传入两个整数,在服务端对这两个整数进行加运算,然后将结果返回给客户端。
     int add(int num1,int num2);
}

写完接口文件后构建一下工程(make project或者所属的model),会在build目录下生成一个对应的java文件来给我们使用
Android:AIDL简单使用_第2张图片
2.在java路径下创建一个service服务,用于处理客户端传来的值

public class IRemoteService extends Service {

    /**
     * 当客户端绑定到该服务会执行
     * @param intent
     * @return
     */
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return iBinder;
    }

   //在此完成处理客户端传来的值的逻辑
    private IBinder iBinder = new IAddInterface.Stub() {
        @Override
        public int add(int num1, int num2) throws RemoteException {
            Log.e("zhou","收到了num1="+num1+"num2="+num2);
            return num1+num2;
        }
    };
}

3.在AndroidManifest中注册服务

<service android:name="com.example.com.myAIDL.IRemoteService"  //必须全名,否则客户端会绑定失败
            android:enabled="true"   
            android:exported="true"/>   //允许外部访问

4.创建一个新工程(客户端),并将在服务端中定义的aidl文件拷贝到客户端的相同位置,
需要注意的是要连带路径拷贝,同样构建项目
Android:AIDL简单使用_第3张图片接下来我们看看是如何调用的

public class MainActivity extends AppCompatActivity {
    IAddInterface iAddInterface;
    private ServiceConnection coon = new ServiceConnection() {
        //绑定上服务时调用
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            //拿到了远程的服务
            iAddInterface = IAddInterface.Stub.asInterface(service);
        }

        //断开服务时
        @Override
        public void onServiceDisconnected(ComponentName name) {
            iAddInterface = null;
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        bindService();  //一定要在通信前先绑定
        findViewById(R.id.tv_1).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    int add = iAddInterface.add(1, 2);
                    Log.e("zhou","和="+add);
                } catch (RemoteException e) {
                    e.printStackTrace();
                }
            }
        });
    }

    private void bindService() {
        //获取到服务端
        Intent intent = new Intent();
        intent.setComponent(new ComponentName("com.example.com.myAIDL", "com.example.com.myAIDL.IRemoteService")); //服务端定义服务的全类名
        //Context.BIND_AUTO_CREATE 已绑定服务端就自动启动服务
        bindService(intent, coon, Context.BIND_AUTO_CREATE);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unbindService(coon); //销毁时断开绑定
    }
}

到此就完成了两个程序间的通讯。

你可能感兴趣的:(android)