Android系统中,各应用程序都运行在自己的进程中,通常情况下,各进程之间无法直接进行数据交换。为了实现这种跨进程通信(InterProcess communication,简称IPC),Android提供了AIDL Service。
一、AIDL Service简介
- Android的远程Service调用与Java的远程方法调用(RMI)基本相似,都是先定义一个远程调用接口,然后为该接口提供一个实现类。
- 本地Service的onBind方法会将Service的代理对象(IBinder对象)传递给客户端,远程Service的onBind方法会将IBinder对象的代理对象(Stub对象)传递给Service。
二、创建AIDL文件
以下代码定义了一个aidl文件,其中定义了一个供客户端调用的方法getCount()。
-
package org.iti.tailyou.aidlservice; -
interface ICount{ -
int getCount(); -
}
- AIDL定义的接口文件必须以.aidl结尾;
- AIDL接口中用到的数据类型,除了基本类型、String、List、Map、CharSequence外,其他类型都需要导包。
- 定义好aidl接口后,ADT工具会自动生成一个ICount.java接口,该接口中包含一个Stub内部类,该内部类实现了IBinder、ICount两个接口。

三、定义Service实现类,将接口暴露给客户端
该Service实现类的onBind()方法所返回的IBinder对象是ADT所生成的ICount.Stub的子类。
-
package org.iti.tailyou.aidlservice; -
import java.util.Timer; -
import java.util.TimerTask; -
import org.iti.tailyou.aidlservice.ICount.Stub; -
import android.app.Service; -
import android.content.Intent; -
import android.os.IBinder; -
import android.os.RemoteException; -
public class AIDLService extends Service { -
private int count = 0; -
public class CountBinder extends Stub { -
@Override -
public int getCount() throws RemoteException { -
return count; -
} -
} -
@Override -
public IBinder onBind(Intent arg0) { -
new Timer().schedule(new TimerTask() { -
@Override -
public void run() { -
count++; -
} -
}, 1000l,1000l); -
return new CountBinder(); -
} -
}
四、客户端调用远程Service
必须将服务端定义的aidl文件拷贝到客户端。

客户端调用代码:
-
package org.iti.tailyou.aidlclient; -
import org.iti.tailyou.aidlservice.ICount; -
import android.app.Service; -
import android.content.ComponentName; -
import android.content.Intent; -
import android.content.ServiceConnection; -
import android.os.Bundle; -
import android.os.IBinder; -
import android.os.RemoteException; -
import android.support.v7.app.ActionBarActivity; -
import android.util.Log; -
import android.view.View; -
import android.view.View.OnClickListener; -
public class MainActivity extends ActionBarActivity implements OnClickListener { -
private ICount countService; -
private ServiceConnection sc = new ServiceConnection() { -
@Override -
public void onServiceDisconnected(ComponentName name) { -
} -
@Override -
public void onServiceConnected(ComponentName name, IBinder service) { -
countService = ICount.Stub.asInterface(service); -
try { -
Log.i("", -
"------------------------count " -
+ countService.getCount()); -
} catch (RemoteException e) { -
e.printStackTrace(); -
} -
} -
}; -
@Override -
protected void onCreate(Bundle savedInstanceState) { -
super.onCreate(savedInstanceState); -
setContentView(R.layout.activity_main); -
findViewById(R.id.btnBind).setOnClickListener(this); -
findViewById(R.id.btnUnbind).setOnClickListener(this); -
findViewById(R.id.btnGetCount).setOnClickListener(this); -
} -
@Override -
public void onClick(View arg0) { -
switch (arg0.getId()) { -
case R.id.btnBind: -
bindService(new Intent("org.iti.tailyou.aidlservice.AIDLService"), -
sc, Service.BIND_AUTO_CREATE); -
break; -
case R.id.btnUnbind: -
unbindService(sc); -
break; -
case R.id.btnGetCount: -
try { -
Log.i("", -
"------------------------count " -
+ countService.getCount()); -
} catch (RemoteException e) { -
e.printStackTrace(); -
} -
break; -
default: -
break; -
} -
} -
}
Demo下载地址: http://download.csdn.net/detail/tailyou/9074391
在Android系统中,各应用程序运行在不同进程,为实现跨进程通信,Android提供了AIDL Service。本文介绍了AIDL Service的简介,包括与Java远程方法调用的相似性;还说明了创建AIDL文件的要点,以及定义Service实现类和客户端调用远程Service的方法。
1105

被折叠的 条评论
为什么被折叠?



