进程之间的通信之AIDL

AIDL即Android Interface definition language的缩写,是Android接口定义语言,是IPC进程间通信方式的一种,用于Android设备上两个进程之间进行进程间通信。适用于两个应用之间进行大量数据的传递,分为服务端和客户端,服务端主要提供数据,是被调用的对象,客户端接收数据,是调用的对象。下来我们看看AIDL在Android Studio中的集成使用。

一、服务端

1、在android studio中新建一个Modle作为服务端,起名为AIDLServer。在main文件夹下创建AIDL文件夹,如下:


会创建一个接口,接口名称可以任意修改,接口中提供一些方法,这些方法的作用就是根据客户端和服务端的需求的需求来写的,客户端需要什么数据,就返回什么数据,可以是字符串,集合,对象,json,xml等等格式数据,这里举个例子,假设服务端想接收年龄,返回处理后的年龄给客户端,则可以这样写:

interface ServiceInterface {
   void setAge(int age);
   String getAge();
}
如果还需要其他方法的话,还可以继续添加 。此时,接口就写完了,然后我们编译一下程序,就会在build/generated/source文件夹下生成aidl文件:


2、写一个服务继承自Server。在服务的onBind方法中返回所需要的IBinder数据。

public class MyService extends Service {
    private int age;

    public MyService() {
    }

    @Override
    public IBinder onBind(Intent intent) {
        return new MyIBind();
    }

    public class MyIBind extends ServiceInterface.Stub {

        @Override
        public void setAge(int age) throws RemoteException {
            MyService.this.age = age;
        }

        @Override
        public String getAge() throws RemoteException {
            return "服务端年龄加10后的年龄:" + (age+10);
        }
    }
}
方法一的setAge就是客户端请求过来的数据,方法二getAge是服务端处理后的数据。

二、客户端
1、在android studio中创建一个Modle模块,作为服务端,把服务端新建的main目录下的AIDL文件拷贝到对应的main目录下,再进行编译。同样会在build/generated/source文件夹下生成aidl文件。

2、在Activity中绑定服务并且启动,注意这个服务开启的是另一个应用程序的服务,并不是自身的服务。

    Intent intent = new Intent("testdemo");
    intent.addCategory(Intent.CATEGORY_LAUNCHER);
    intent.setPackage("com.example.aidlserver");
    bindService(intent,conn,BIND_AUTO_CREATE);
    startService(intent);
private ServiceConnection conn = new ServiceConnection() {
         @Override
         public void onServiceConnected(ComponentName name, IBinder service) {
             ServiceInterface serviceInterface = ServiceInterface.Stub.asInterface(service);
             try {
                 serviceInterface.setAge(20);
                 String age = serviceInterface.getAge();
                 Toast.makeText(MainActivity.this,"年龄是:"+age,Toast.LENGTH_SHORT).show();
             } catch (RemoteException e) {
                 e.printStackTrace();
             }
         }

         @Override
         public void onServiceDisconnected(ComponentName name) {

         }
     };
ServiceConnection有两个方法,一个是服务连接上时,另一个是服务断开时的方法,当调用服务里面的方法时候,传递一个数据给服务端,服务端处理后再调用方法获取处理后的数据后供前台展示。



评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值