Android Framework:AIDL

AIDL(Android Interface Definition Language)
程序员可以利用AIDL来实现客户端和服务端的之间实现通信(IPC)。
看看下面的例子。本例创建两个apk应用,一个应用作为AIDL的服务提供方,而另外一个应用作为AIDL服务调用方。

AIDL服务提供方

首先进入服务提供方的工程,创建aidl文件。本例中,在com.myandroid.aidl包下定义了一个IMyService.aidl文件,它仅有一个接口helloAndroidAIDL,形参为String name,返回String对象。

package com.myandroid.aidl;
interface IMyService{
    String helloAndroidAIDL(String name);
}

开发插件安装正确以及AIDL文件定义正确的情况下,ADT开发插件会在工程中gen目录下创建对应的IMyService.java文件,其包路径与AIDL文件定义的路径一致,为com.myandroid.aidl。

接着实现helloAndroidAIDL接口的逻辑实现,在AIDL接口定义文件一致的包路径com.myandroid.aidl下创建MyService类,继承android.app.Service类,并有一个内部类实现了IMyService.Stub接口,具体代码如下:

public class MyService extends Service{
    public class MyServiceImpl extends IMyService.Stub{
        @Override
        public String helloAndroidAIDL(String name) throws RemoteException {
            System.out.println("helloAndroidAIDL:"+name);
            return "AIDL MyService return value";
        }
    }
    @Override
    publicd IBinder onBind(Intent intent){//AIDL固定写法
        return new MyServiceImpl();//返回IMyService.Stub子类对象
    }
}

实现MyService类后,还需要对此AIDL服务进行配置,以便Android平台能识别此服务。打开AndroidManifest.xml文件开始配置,在application节点里加入如下xml配置信息。

<service android:name="com.myandroid.aidl.MyService">
    <intent-filter>
        <action android:name="com.myandroid.aidl.IMyService" />
    </intent-filter>
</service>

到此运行apk的时候,服务提供方已经完成。很简单。

AIDL服务调用方

生成一个AIDL服务端apk工程。然后按以下步骤实现AIDL服务调用方。
步骤1: 将AIDL服务端生成的Java文件 com/myandroid/aidl/IMyService.java复制到本工程,尽量不要改变其包路径和文件名,这样客户端也就知道服务端具有什么样的能力,即AIDL服务端的接口定义
步骤2:编写代码绑定服务,获取AIDL服务对象
步骤3:通过AIDL服务对象完成AIDL接口调用。

首先在需要调用Activity中定义IMyService myService服务调用对象,然后创建serviceConnection对象,服务绑定相关代码如下:

private ServiceConnection serviceConnection = new ServiceConnection(){
    public void onServiceConnected(ComponentName name,IBinder service) {
        myService = IMyService.Stub.asInterface(service);   
        button2.setEnabled(true);
    }
    public void onServiceDisconnected(ComponentName name){
    }
}
//绑定服务,此代码可放入特定事件或一些触发事件
Intent intent = new Intent("com.myandroid.aidl.IMyService");
bindService(intent, serviceConnection,Context.BIND_AUTO_CREATE);

AIDL服务调用代码如下:

String msg = myService.helloAndroidAIDL("Other Application");
Toast toast = Toast.makeText(AidlClient.this,msg,Toast.LENGTH_SHOT);
toast.show();

调用服务端的helloAndroidAIDL方法,服务端会打印出”helloAndroidAIDL:Other Application”日志,调用端通过Toast显示服务端返回String,其内容为”AIDL MyService return value”。这样,AIDL服务端和客户端完成了完整交互流程。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值