Java AIDL是如何工作的?
我正在尝试实现AIDL,但我不明白它是如何工作的。我的意思是调用方法的过程是什么 我不知道如何通过AIDL将对象从服务获取到我的活动。 我一直在使用指南,但我很困惑。谢谢 更新: 在服务连接中,我有这些行,其中mCallback是一个IRemoteServiceCallbackJava AIDL是如何工作的?,java,android-service,aidl,Java,Android Service,Aidl,我正在尝试实现AIDL,但我不明白它是如何工作的。我的意思是调用方法的过程是什么 我不知道如何通过AIDL将对象从服务获取到我的活动。 我一直在使用指南,但我很困惑。谢谢 更新: 在服务连接中,我有这些行,其中mCallback是一个IRemoteServiceCallback public void onServiceConnected(ComponentName name, IBinder service) { mRemoteInterface = IRemoteI
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,其中McCallbacks是
final RemoteCallbackList <IRemoteServiceCallback> mCallbacks
= new RemoteCallbackList <IRemoteServiceCallback> ();
IRemoteServiceCallback(mCallback)拥有的唯一方法是:
我也有一个处理者,但我不太确定该怎么办:
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是一步一步走的
现在,RemoteCallbackList有了我需要的回调,我可以在activity类的mHandler中看到,我终于能够获得我想要的对象。Android中的跨应用程序服务基于Binder,一个内核级IPC系统(这就是
IBinder
类名的来源)。当您绑定到远程服务(即应用程序外部的服务)时,它可以向您返回一个对象。但是,由于您不知道实际类型是什么(方法、字段等),因此无法将其转换为可用类型
这就是AIDL的用武之地——它是一种与语言无关的指定接口的方式——方法及其参数的集合(它看起来也像Java——事实并非如此)。如果客户端和服务器都使用相同的.aidl文件,则可以通过生成的Java接口--IRemoteService.Stub.asInterface(obj)
绑定到对象。在服务端,您只需要用某种语言实现相同的接口(框架中的一些服务是用C++实现的),而IPC机制将处理其余部分
也就是说,除非导出服务并希望外部应用程序能够使用它,否则不需要使用AIDL。如果没有,只需在应用程序中实现IBinder,并直接强制转换在服务连接上收到的对象,因为您知道它的类型。感谢您的响应。我之所以使用AIDL,是因为我们可能会在需要这个功能的地方实现一些东西,但目前还没有,这样可以吗?(比如,如果我所做的都在一个应用程序中,它仍然可以工作)。另外,您能解释一下registerCallback和register的作用吗?如果你能查看更新后的问题,看看我正在谈论的方法,那就太好了。我仍然对这项服务的使用感到困惑。我在哪里使用IRemoteInterface中的方法?(我在服务中定义了它们,但在哪里使用它们?)。如何发送对象?在本例中,这些只是RemoteService的IBinder上的方法。您可以在这里找到实现——本质上,它们只是服务返回的IBinder对象中的方法。您不必将实际调用转发给处理程序,但远程方法是从各种线程调用的,这可能是使它们成为线程安全的最简单方法。感谢链接。这很有帮助。在我的服务中,我将从服务器获得一个“Vehicle”(一个我制作成可包裹的类)。如何将此车辆发送回Main(绑定到服务的活动)?您可以使用示例中的模式-注册回调,然后将车辆发送到所有注册的回调。
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);
}
}
};