Android Aidl机制

Aidl机制提供进程间传递对象。
当然在进程间传递对象也可以使用广播吧,但他们的使用方向是不一样的,大概如此。

实现Android进程间传递对象的步骤如下:
1.编写aidl接口。
TestService.aidl

package com.xwangly.service;

interface TestService {
/**
* 获取人员列表
* @param sex
* @return
*/
List getPersonList(in String sex);

/**
* 查询人员姓名
* @param id
* @return
*/
String getPersonName(int id);

/**
* 查询人员ID
* @param name
* @return
*/
int getPersonId(in String name);

/**
* 显示人员信息
* @param name
*/
void showPersonInfo(out List personList);

}

aidl中的参数有in或out。当然out也可以使用返回值的形式,如getPersonName函数。

2.编写远程服务。远程服务类就是普通的Android服务。不过该服务的onBind方法要返回一个TestService.Stub对象。一般在该服务中需要实现该类并创建对象。
com.xwangly.service.RemoteService.java

package com.xwangly.service;

import java.util.ArrayList;
import java.util.List;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;

public class RemoteService extends Service {
private final String TAG = "RemoteService";

public TestService.Stub aidl = new TestService.Stub(){

public int getPersonId(String name) throws RemoteException {
// TODO Auto-generated method stub
return name=="wang"?1:2;
}

public String getPersonName(int id) throws RemoteException {
// TODO Auto-generated method stub
return "wang "+id;
}

public void showPersonInfo(List personList) throws RemoteException {
// TODO Auto-generated method stub
personList.add("wang");
personList.add("xiao");
}

public List getPersonList(String sex)
throws RemoteException {
// TODO Auto-generated method stub
//personList = new ArrayList();
List personList = new ArrayList();
personList.add("wang "+sex);
return personList;
}

};

@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
Log.i(TAG, intent.getAction());
return aidl;
}

}

在manifest中配置如下:

<service android:name="RemoteService">
<intent-filter>
<action android:name="com.xwangly.service.TestService" />
</intent-filter>
</service>


3.客户端连接远程服务,得到aidl接口的一个实例,通过该实例,客户端可以像本地服务一样使用该服务。(客户端即为另一应用。)
首先客户端需要实现一个服务连接器serviceConnection,在该接口的onServiceConnected中实现创建服务接口,代码如下:
tService = TestService.Stub.asInterface(service);

然后客户端需要bindService

Intent intent = new Intent("com.xwangly.service.TestService");
bindService(intent, connect, BIND_AUTO_CREATE);

Intent的action即为服务端aidl文件的类全名。需要在服务端的manifest中配置相应的action过滤。如第二步中的manifest配置所示。
connect即为刚实现的serviceConnection实例。
这样客户端就可以使用tService对象了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值