安卓AIDL通信机制的简单使用以及错误分析

AIDL概念:一种接口定义语言,用于约束两个进程间的通讯规则,供编译器生成代码

首先介绍一下简单的用法:

    使用 AIDL 进行进程之间的通信时要先定义好 客户端 与 服务端.

服务端

        定义:提供功能性服务组件所在的应用程序.

        首先定义一个 AIDL 接口(AIDL 是进程之间通信的一种接口定义语言,若两个应用程序都遵从此接口,则两程序间可以无障碍交流,

就像两个人先声明交流使用英语还是汉语一样,当双方使用相同的标准的时候,他们就可以交流了)

                1),创建类包 在此包下创建一个aidl文件 (例如: MyInterface.aidl)

    

package com.chen.aidl;
interface MyInterface{
//此处的接口不能声明除默认(default)之外的任何其它的访问权限,否则导致编译失败
    String getString(int type);
}

    当保存此文件之后,gen文件夹下会出现一个名为 com.chen.aidl 的包,其中包含一个 处理过的MyInterface.java 源文件

此源文件中包含了MyInterface接口和Stup抽象类.   

public static abstract class Stub extends android.os.Binder implements
            com.chen.aidl.MyInterface {}

由此部分可以看出Stup接口继承了Binder类,同时实现了自定义的接口


在此过程中你的MyInterface.java可能会报错(AIDL 源文件报错),导致此发生的情况可能是你的java编译环境版本过低, 在eclipse里设置 window-preferences-java-Compiler 中将jdk至少设置为1.6保存后 clean即可

        2,) 创建Service子类,并在onBind()方法中返回自定义AIDL接口对象,其对象的获得方式为(如果不知道如何使用绑定Service,请参考博客中其他文章

使用绑定Service的方法实现简易播放功能

)

public IBinder myBinder=new MyInterface.Stub() {
        //重写自定义接口的方法,并在其中指定进程间相互通信的详细过程
        //详细过程:客户端调用服务端的此方法,向其中输入一个参数,服务端根据这个参数向客户端返回相应数据
        //这只是简单的举个栗子
        public String getString(int type) throws RemoteException {
            switch(type){
            case 1:
                return "hello";
            default:
                return "world";
            }
        }
    };

    3)在应用清单文件中注册Service,同时声明Action

<service
            android:name="com.chen.aidlservice.MyService"
            android:enabled="true"
            android:exported="true" >
            <intent-filter>
                <action android:name="com.chen.aidlservice.MyService" />
            </intent-filter>
        </service>

好了,服务端写完了,现在开始写服务端

客户端

    1)用同服务端相同的方式新建一个adil文件

    2)实例化ServiceConnection接口对象,用来监听绑定组件之间的连接

    与普通的绑定服务不同的是,在此onServiceConnected(ComponentName cName,IBinder service)方法中将第二个参数强转为.aidl接口对象

private MyInterface myInterface;
public void onServiceConnected(ComponentName name, IBinder service) {
            myInterface = MyInterface.Stub.asInterface(service);
            //调用此方法时,将获得服务器产生的IBinder myBinder对象,从而调用该对象中的方法
        }


    3)在适当的位置使用隐式意图绑定服务,通常在初始化时

    

Intent intent = new Intent("com.chen.aidlservice.MyService");
Context.bindService(intent, new MyServiceConnection(), BIND_AUTO_CREATE);

    完成此步骤后就可以在任意位置通过getString()方法与服务端进行交流了

    

转载于:https://my.oschina.net/oschenxiaomo/blog/505141

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值