转载---AIDL
开发环境为Eclipse。
拣重要的先说,来看看aidl文件的内容:
文件:forActivity.aidl
}??注意onBind(),它的返回类型为IBinder,返回了一个mBinder,看看mBinder的定义:
??? private final forService.Stub mBinder = new forService.Stub() {
??????? @Override
??? ??? public void invokCallBack() throws RemoteException
??? ??? {
??? ??? ??? callback.performAction();
??? ???? }
??????? @Override
??? ??? public void registerTestCall(forActivity cb) throws RemoteException
??? ??? {
??? ??? ??? callback = cb;
??????? }
?????? };
它是实现了我们在AIDL中定义的方法,这个mBinder最终返回给了mAIDLActivity中的mService,于是在mAIDLActivity中可以使用mBinder中的方法了。在mAIDLActivity中也有一个类似mBinder的对象,看看定义: ??
??????? private forActivity mCallback = new forActivity.Stub()
??? {
?? ??? ?public void performAction() throws RemoteException
?? ??? ?{
?? ??? ??? ?Toast.makeText(mAIDLActivity.this, "this toast is called from service", 1).show();
?? ??? ?}
?? ?? };
我们要在界面上显示一个toast,就是在这里实现的。这个对象,在mConnection的onServiceConnected()被调用时,通过调用mService(也就是远程的mAIDLService中的mBinder)的registerTestCall(),传递给了mAIDLService,于是在mAIDLService中可以调用performAction()了。
很啰嗦,只为了能把这个细节说清楚。请大家认真看,我尽量避免错别字、混乱的大小写和逻辑不清的语法,相信你会看明白。是不是很简单?再啰嗦一下,做一个大致总结,我们使用AIDL是要做什么呢:
让Acticity(或者说一个进程/一个类?)和Service(或者说远端进程/远端类/对象?)获取对方的一个Stub对象,这个对象在定义时实现了我们在AIDL中定义的方法,于是这些远程对象中的方法可以在本地使用了。如果这种使用(通信)是单向的,比如只是Activity需要通知Service做什么,那么只要Service中有一个Stub对象,并且传给Acticity就够了。
至于如何获得远程的Stub,参看上面的代码,看mConnection、registerTestCall、onRebind,它们展示了一种方法。
另外,有时候我们可能在一个类中有多个Stub对象,它们都要给远程交互的类的实例,这个时候可以考虑使用RemoteCallbackList<>(docs/reference/android/os/RemoteCallbackList.html)。
欢迎阅读、收藏本文。例子随手写的,功能只在演示AIDL的使用。您可以转载本文,但请勿盲目乱贴。不是我小气,我不权威,我怕它被贴到泛滥,以讹传讹,害了人。
?