Android进程间通信(IPC)之AIDL

前言

AIDL(Android Interface definition language)即Android接口定义语言。

项目实例

首先,准备两个应用,一个作为客户端,一个作为服务端。当然你也可以用一个应用实现,无非就是应用内跨进程和多应用跨进程的区别,原理是一样的。下面分别对每个端上需要操作的步骤进行说明。

服务端:

第一步:创建aidl接口定义文件

在你的服务端项目中,右键->New->AIDL->AIDL File,输入接口名称,然后as会自动在/src/main目录下生成aidl文件夹,路径与主项目/src/main/java目录一致。

这里我创建了一个IUserProxy.aidl文件,并自定义了如下几个接口

// IUserProxy.aidl
package com.xuhj.ipc.server;

// Declare any non-default types here with import statements
import com.xuhj.ipc.server.model.User;

interface IUserProxy {

    List<User> getUserList();

    void addUser(in User user);

}

如果用到自定义对象,比如我这里用到了一个User对象,则必须实现Parcelable接口,同时需要在aidl目录下新建一个aidl文件,进行该对象的声明。
PS: 这个User对象建议最好也放在aidl目录下,这样方便后面把aidl中的文件全部复制到客户端上来复用。

例如:这里我创建了一个User对象,则需要再创建一个User.aidl文件,并添加如下声明内容。
注意:这个User.aidl不要用自动生成aidl的方法去创建,需要自己手动新建New File,文件名为User.aidl

package com.xuhj.ipc.server.model;

parcelable User;

以上步骤完成后,对项目进行一次Build,会在/build/generated/source/aidl下生成对应的java文件,这就是我们刚才定义的IUserProxy.aidl转换后的java类,有兴趣可以查看相关资料。as只是帮我们自动完成了这个步骤,我们也可以完全自己写这个java类。

第二步:创建Service服务类

新建类AidlService并继承Service


public class AidlService extends Service {
    private static final String TAG = "服务端:AidlService";

    private Binder mBinder = new IUserProxy.Stub() {

        @Override
        public List<User> getUserList() throws RemoteException {
            Log.d(TAG, "收到客户端的调用getUserList");
            return null;
        }

        @Override
        public void addUser(User user) throws RemoteException {
            Log.d(TAG, "收到客户端的调用addUser");
        }

    };

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return mBinder;
    }

}

最后别忘了在manifest中添加service声明。这里我用了action供其他应用调用。


        <service android:name=".service.AidlService">
            <intent-filter>
                <action android:name="com.xuhj.action.ipc.server.AidlService" />
            </intent-filter>
        </service>

好啦,一个简单的服务端就这样创建完成了。

客户端:

第一步:复制aidl文件

把服务端的aidl文件全部复制到客户端相同目录下。这样保证客户端调用的和服务端调用的是一样的类。

第二步:创建ServiceConnection服务连接类

新建类AidlConn并继承ServiceConnection


public class AidlConn implements ServiceConnection {
    private static final String TAG = "客户端:AidlConn";

    private com.xuhj.ipc.server.IUserProxy mIUserProxy;

    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        mIUserProxy = com.xuhj.ipc.server.IUserProxy.Stub.asInterface(service);
        try {
            User sendUser = new User(77, "i am client");
            Log.d(TAG, "调用addUser");
            mIUserProxy.addUser(sendUser);

            Log.d(TAG, "调用getUserList");
            List<User> userList = mIUserProxy.getUserList();

        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
    }

}

第三步:开启远程服务

在客户端的Activity中,开启远程服务


    private void invokeIPCAidlFromServer() {
        Intent i = new Intent();
        i.setAction("com.xuhj.action.ipc.server.AidlService");
        i.setPackage("com.xuhaj.ipc.server");
        AidlConn aidlConn = new AidlConn();
        bindService(i, aidlConn, BIND_AUTO_CREATE);
    }

好了,一个简单的AIDL通信就这样完成了。

如果需要多个AIDL通信,可以通过BinderPool来管理,有兴趣可以查看相关资料。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

果冻豆人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值