我正在尝试实现 AIDL,但我只是不明白它是如何工作的。我的意思是,调用方法的进程是什么?
我不明白如何通过 AIDL 从服务中获取对象到我的 Activity 。
我一直在使用 google docs 作为指导,但我很困惑。谢谢
更新:
在服务连接中,我有这些行,其中 mCallback 是一个 IRemoteServiceCallback。
public void onServiceConnected(ComponentName name, IBinder service) {
mRemoteInterface = IRemoteInterface.Stub.asInterface(service);
Log.v(TAG, "Interface bound.");
try{
mRemoteInterface.registerCallback(mCallback);
}catch(RemoteException e){
}
Toast.makeText(MainActivity.this, "Remote Service Connected",
Toast.LENGTH_SHORT).show();
}
这是 registerCallback,其中 mCallbacks 是一个
final RemoteCallbackList <IRemoteServiceCallback> mCallbacks
= new RemoteCallbackList <IRemoteServiceCallback> ();
.....
public void registerCallback(IRemoteServiceCallback callback)
throws RemoteException {
if(callback != null){
mCallbacks.register(callback);
}
}
IRemoteServiceCallback(mCallback) 的唯一方法是:
public void valueChanged(int value) {
mHandler.sendMessage(mHandler.obtainMessage(BUMP_MSG, value, 0));
}
我也有一个处理程序,但我不太确定如何处理它:
private Handler mHandler = new Handler() {
@Override public void handleMessage(Message msg) {
switch (msg.what) {
case BUMP_MSG:
Log.d(TAG, "Received from service: " + msg.arg1);
break;
default:
super.handleMessage(msg);
}
}
};
更新 2:
AIDL 步骤——据我所知——。
现在,我注意到有两个 mHandler,一个在服务中,一个在 Activity 中。 [ 什么时候称呼它们以及它们之间在使用方面的区别是什么 ]
现在,RemoteCallbackList 具有我需要的回调,我可以在 Activity 类的 mHandler 中看到我最终能够获得我想要的对象。
最佳答案
Android 中的跨应用服务基于内核级 IPC 系统 Binder(这是 IBinder
类名的来源)。当您绑定(bind)到远程服务(即应用程序之外的服务)时,它可以向您返回一个对象。但是,由于您不知道实际类型是什么(方法、字段等),因此您无法将其转换为可用类型。
这就是 AIDL 的用武之地——它是一种与语言无关的指定接口(interface)的方式——方法及其参数的集合(它看起来也很像 Java——它不是)。如果客户端和服务器使用相同的 .aidl 文件,您可以通过生成的 Java 接口(interface) - IRemoteService.Stub.asInterface(obj)
绑定(bind)到对象。在服务方面,您只需要用某种语言实现相同的接口(interface)(框架中的一些服务是用 C++ 编写的),其余的由 IPC 机制处理。
也就是说,除非您导出服务并希望外部应用程序能够使用它,否则您不需要使用 AIDL。如果没有,只需在您的应用程序中实现 IBinder 并直接转换在 onServiceConnected
中接收到的对象,因为您知道它的类型。
关于java - AIDL 是如何工作的?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17886047/