Android IPC之AIDL

什么是AIDL:
AIDL即android interface definition language--android接口定义语言(通过android系统底层间接通讯。AIDL基于service),用于进程之间的通信,进程之间为何不能直接通信,而需要一些机制呢?(当然是进程之间不能共享内存导致的咯(^_^) )
什么时候使用AIDL才恰到好处呢:
对android IPC的通信方法做个比较就可明白一二了
AIDLBindermessage
多线程没有多线程没有多线程
多应用多应用/
开发环境
android studio
操作步骤:new->folder->AIDL 生成AIDL目录

这里写图片描述

这里写图片描述

从图片中可以看到不管是哪种目录,AIDL文件夹和java都是同级的(这点是和Eclipse是不同的),再将AIDL创建好之后,在android studio中一定要先编译一次,否则无法调用哦

实例:
最简单的计算题,求两个数的和……

在客户端输入两个数,要求在服务器端计算出两个数的和,然后将计算结果返回,哦哦,文字表达可能并不显而易见,来副图

这里写图片描述

新建一个工程,之后新建一个module,我这儿是clientaidl
这里写图片描述

服务端app

new->folder->AIDL Folder生成目录
新建一个aidl文件
// IMyAidlInterface.aidl
package com.vickay.aidltest;

// Declare any non-default types here with import statements
interface IMyAidlInterface {

    //计算两个数的和
    int add(int num1,int num2);
}
新建一个service,为啥?看博文开头
    public class vickayService extends Service {

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

    private IBinder iBinder = new IMyAidlInterface.Stub(){

        @Override
        public int add(int num1, int num2) throws RemoteException {

            //Log.d("TAG","收到了来自客户端的请求,输入的参数是" + num1 + "和" + num2);

            return num1 + num2;
        }
    };

}

在清单文件中记得注册该service

    <service android:name=".vickayService"
        android:enabled="true"
        android:exported="true"
        />

客户端app

新建一个AIDL文件,要求和服务端的AIDL同包名,同名称(直接复制粘贴)

这里写图片描述

MainActivity.java

    public class MainActivity extends Activity implements View.OnClickListener {

    private EditText mNum1;
    private EditText mNum2;
    private EditText result;
    private Button cal;

    IMyAidlInterface iMyAidlInterface;

    private ServiceConnection conn = new ServiceConnection() {
        //当与服务端连接成功时
        @Override
        public void onServiceConnected(ComponentName name, IBinder iBinder) {
            //拿到了远程的服务
            iMyAidlInterface = IMyAidlInterface.Stub.asInterface(iBinder);
        }
        //当与服务端断开连接时
        @Override
        public void onServiceDisconnected(ComponentName name) {
            //回收资源
            iMyAidlInterface = null;
        }
    };

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

        initView();

        //软件已启动就绑定服务
        bindService();
    }

    private void initView(){
        mNum1 = (EditText) findViewById(R.id.num1);
        mNum2 = (EditText) findViewById(R.id.num2);
        result = (EditText) findViewById(R.id.result);
        cal = (Button) findViewById(R.id.cal);

        cal.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {

        int num1 = Integer.parseInt(mNum1.getText().toString());
        int num2 = Integer.parseInt(mNum2.getText().toString());
        int res;
        try {

            res = iMyAidlInterface.add(num1,num2);
            result.setText(res + "");

        } catch (RemoteException e) {
            e.printStackTrace();
            result.setText("远程调用错误");
        }
    }

    private void bindService(){

        //获取到服务端
        Intent intent = new Intent();
        //android5.0以后必须显示intent启动绑定服务
        intent.setComponent(new ComponentName("com.vickay.aidltest","com.vickay.aidltest.vickayService"));
        bindService(intent,conn, Context.BIND_AUTO_CREATE);
    }

    //当activity被销毁的时候解除绑定

    @Override
    protected void onDestroy() {
        super.onDestroy();

        unbindService(conn);
    }
}
最后在运行的时候,一定要保证服务端开启,否则会有空指针异常

AIDL还有其他的东西,下篇再记录
源码下载

如记录有误,欢迎指正!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值