AIDL这里就不加累述它的概念定义等等,免得长篇大幅。下面介绍的是简单的一次使用AIDL成功与service通信的一个例子:
1.在项目包下新建一个IInfo.aidl,并在其中添加你要调用的方法,格式和java中接口一样。package com.android.server;
interface IInfo {
boolean start();
void stop();
void locate(int x, int y);
void move(int dx, int dy);
void getLocation(inout int[] p);//参数为数组的话,可以加上inout,不然会报错
void setTimeout(int t);
int getTimeout();
void setBitmap(inout byte[] bmp, int width, int height);}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
正确写好之后,eclipse的adt会自动在gen目录下生成一个IInfo.java文件
2.新建一个CursorService.java类,继承IInfo.stub,如下:
package com.android.server;
public class CursorService extends ICursorInfo.Stub{
final boolean hasService;
public CursorService() {
hasService = initializeJNI();
}
public synchronized boolean start() {
if (hasService)
return start0();
return false;
}
public synchronized void stop() {
if (hasService)
stop0();
}
public synchronized void locate(int x, int y) {
if (hasService)
locate0(x, y);
}
public synchronized void move(int dx, int dy) {
if (hasService)
move0(dx, dy);
}
public synchronized void getLocation(int[] p) {
if (p == null)
throw new NullPointerException("p is null");
if (p.length < 2)
throw new IllegalArgumentException("p.len must >= 2");
if (hasService)
getPosition0(p);
}
public synchronized void setTimeout(int t) {
if (hasService)
setTimeout0(t);
}
public synchronized int getTimeout() {
if (hasService)
return getTimeout0();
return -1;
}
public void setBitmap(byte[] bmp, int width, int height) {
if(bmp == null)
throw new NullPointerException("bmp is null");
if(width < 0 || height < 0)
throw new IllegalArgumentException("width < 0 || height < 0");
if(width * height > bmp.length)
throw new IndexOutOfBoundsException("bmp less than width*height");
setBitmap0(bmp,width,height);
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
- 52.
- 53.
在其中实现你aAIDL中的方法
3. 新建一个Manager类,在其中构造一个内部服务连接类,实现ServiceConnection接口:
public class Manager {
private static final String TAG = "Manager";
private IInfo iCurSer;
private Manager(){
}
public Manager(Context ctx){
this.context = ctx;
new Manager();
}
/**这里就可以与service正常通信,调用service中的方法**/
public void startService(){
Intent intent=new Intent("com.android.server.CursorService");
context.bindService(intent,new CursorServiceConnection(),
Service.BIND_AUTO_CREATE);
}
/**
* 实现ServiceConnection接口
* */
public final class CursorServiceConnection implements ServiceConnection{
// 和CursorService绑定时系统回调这个方法
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// 此处不能使用强制转换, 应该调用Stub类的静态方法获得CursorService接口的实例对象
iCurSer=ICursorInfo.Stub.asInterface(service);
}
//解除和CursorService的绑定时系统回调这个方法
@Override
public void onServiceDisconnected(ComponentName name) {
iCurSer=null;
}
}
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
Android中AIDL的简单使用就mark到这吧,希望对刚刚学Android的开发者能有些帮助。