AIDL实现跨进程通信

AIDL的全称是什么?如何工作?能处理哪些类型的数据?

AIDL的英文全称是Android Interface Define Language

当B进程要去调用A进程中的service时,并实现通信,我们通常都是通过AIDL来操作的

A工程:
首先我们在项目所在的目录下建一个包 (包名自己指定),在包中创建一个IServer.aidl文件 如下图中标注1所示
ADT插件会在gen目录下自动生成一个IServer.java文件,该类中含有一个名为IServer.stub的内部类,该内部类中含有aidl文件接口的get方法。
如下图中标注3所示:
这里写图片描述

在IService.aidl文件中我们自定义一个接口,含有方法get。代码如下:

package com.example.aidl;
interface IServer{
String getInfo(String info);
}

说明一:aidl文件的位置不固定,可以任意
然后定义自己的MyServer类(如上图中标注2所示),在MyServer类中自定义一个内部类去继承IServer.stub这个内部类,实现get方法。在onBind方法中返回这个内部类的对象,系统会自动将这个对象封装成IBinder对象,传递给他的调用者。MyServer代码如下:

public class MyServer extends Service {

@Override
public IBinder onBind(Intent intent) {
    // TODO Auto-generated method stub
    return mBinder;
}

public Binder mBinder = new IServer.Stub() {

    @Override
    public String getInfo(String info) throws RemoteException {
        // TODO Auto-generated method stub
        if ("你好".equals(info)) {
            return "你好,我是你大爷";
        } else {
            return "你好,你是我侄子";
        }
    }
};

}
其次需要在AndroidManifest.xml文件中配置MyServer类,代码如下:
这里写图片描述

为什么要指定调用AIDL服务的ID,就是要告诉外界MyServer这个类能够被别的进程访问,只要别的进程知道这个ID,正是有了这个ID,B工程才能找到A工程实现通信。
说明:AIDL并不需要权限
B工程:
首先我们要将A工程中生成的IServer.java文件拷贝到B工程中如下图:
这里写图片描述

在bindService方法中绑定aidl服务
  绑定AIDL服务就是将IServer的ID作为intent的action参数。代码如下:
 public class MainActivity extends Activity {

private static final String TAG = "MainActivity";
private MyConn conn;
private IServer mServer;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
}

@Override
protected void onStart() {
    // TODO Auto-generated method stub
    super.onStart();
    Intent service = new Intent("com.example.aidl");
    conn = new MyConn();
    bindService(service, conn, BIND_AUTO_CREATE);
}

@Override
protected void onPause() {
    // TODO Auto-generated method stub
    super.onPause();
    if (conn != null) {
        unbindService(conn);
    }
}

class MyConn implements ServiceConnection {

    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        mServer = IServer.Stub.asInterface(service);
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
        // TODO Auto-generated method stub

    }

}

// 点击事件
public void bind(View v) throws RemoteException {
// 向服务器端发送信息
String info = mServer.getInfo(“你好”);

    Toast.makeText(this, "从服务器端返回的信息为" + info, 1).show();
}

}

  说明:如果我们单独将IServer.aidl文件放在一个包里,那个在我们将gen目录下的该包拷贝到B工程中。如果我们将IServer.aidl文件和我们的其他类存放在一起,那么我们在B工程中就要建立相应的包,以保证IServer.java文件的报名正确,我们不能修改IServer.java文件

  ServiceConnection的onServiceConnected(ComponentName name, IBinder service)方法中的service参数就是A工程中MyService类中继承了IServer.stub类的内部类的对象。
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
AIDL(Android Interface Definition Language)是一种Android特有的IPC(Inter-Process Communication,进程间通信)机制,可以实现进程通信。以下是使用AIDL实现进程通信的步骤: 1. 定义AIDL接口:在AIDL文件中定义接口和方法,这些接口和方法将在不同进程之间进行调用。例如,定义一个接口IStudentManager和一个方法addStudent()。 2. 实现AIDL接口:在Service中实现AIDL接口,可以在Service中创建一个Binder对象,然后将该对象返回给客户端,客户端可以使用这个Binder对象调用Service中的方法。 3. 绑定Service:在客户端中绑定Service,通过这种方式,客户端可以获取到Service中的Binder对象,然后调用Service中的方法。 4. 调用方法:在客户端中通过Binder对象调用Service中的方法,实现进程通信。 注意事项: 1. 在使用AIDL时,需要在AndroidManifest.xml文件中注册Service。 2. AIDL接口中只能使用基本数据类型和Parcelable类型,不支持其他类型。 3. AIDL接口中定义的方法必须是线程安全的,因为它们可能在不同进程中被调用。 4. AIDL接口中定义的方法必须是只读的,不应该修改传入的参数。 5. AIDL接口中的方法返回值必须是void或者基本数据类型、String、CharSequence、Parcelable类型。 6. AIDL接口中的方法可以抛出RemoteException异常,因为AIDL接口是基于Binder实现的,所以需要处理Binder连接中断的情况。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Daniel-yan

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

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

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

打赏作者

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

抵扣说明:

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

余额充值