Android IPC之AIDL

来源:互联网 发布:淘宝店铺查封怎么处理 编辑:程序博客网 时间:2024/05/17 04:26

什么是AIDL:

AIDL即android interface definition language--android接口定义语言(通过android系统底层间接通讯。AIDL基于service),用于进程之间的通信,进程之间为何不能直接通信,而需要一些机制呢?(当然是进程之间不能共享内存导致的咯(^_^) )

什么时候使用AIDL才恰到好处呢:

对android IPC的通信方法做个比较就可明白一二了
AIDL Binder message 多线程 没有多线程 没有多线程 多应用 多应用 /

开发环境

android studio操作步骤:new->folder->AIDL 生成AIDL目录

这里写图片描述

这里写图片描述

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

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

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

这里写图片描述

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

服务端app

new->folder->AIDL Folder生成目录新建一个aidl文件
// IMyAidlInterface.aidlpackage com.vickay.aidltest;// Declare any non-default types here with import statementsinterface 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还有其他的东西,下篇再记录
源码下载

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

0 0
原创粉丝点击