aidl的语法非常简单,在要通信的项目中建立.aidl文件,这个文件就是这些项目通信的必要条件。
interface IUser{ String getName(); void setName(String name); String getPassWord(); }
之后就可以建立服务。aidl文件会编译成继承IInterface的接口,其内部类Stub会继承IBinder和实现IUser。
所以我们只需要写一个继承stub的子类,然后通过Service就可以通信啦(注意stub是继承了IBinder的哦)。
public class MyService extends Service { private MyUser iUser; @Override public IBinder onBind(Intent intent) { iUser = new MyUser(); return iUser; } @Override public void onCreate() { // TODO Auto-generated method stub super.onCreate(); } @Override public void onStart(Intent intent, int startId) { // TODO Auto-generated method stub super.onStart(intent, startId); } @Override public void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); } class MyUser extends IUser.Stub{ private String name = "ctt"; @Override public String getName() throws RemoteException { return name; } @Override public String getPassWord() throws RemoteException { return "123456"; } @Override public void setName(String name) throws RemoteException { this.name = name; } } }
不过在获取远程对象的onbind返回的对象需要用一个代理:
class MyServiceConnection implements ServiceConnection{ @Override public void onServiceConnected(ComponentName name, IBinder service) { IUser iUser = IUser.Stub.asInterface(service); try { System.out.println(iUser.getName()+""); System.out.println(iUser.getPassWord()); iUser.setName("乌索普"); System.out.println(iUser.getName()); } catch (RemoteException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Override public void onServiceDisconnected(ComponentName name) { } }