Java AIDL是如何工作的?

Java AIDL是如何工作的?,java,android-service,aidl,Java,Android Service,Aidl,我正在尝试实现AIDL,但我不明白它是如何工作的。我的意思是调用方法的过程是什么 我不知道如何通过AIDL将对象从服务获取到我的活动。 我一直在使用指南,但我很困惑。谢谢 更新: 在服务连接中,我有这些行,其中mCallback是一个IRemoteServiceCallback public void onServiceConnected(ComponentName name, IBinder service) { mRemoteInterface = IRemoteI

我正在尝试实现AIDL,但我不明白它是如何工作的。我的意思是调用方法的过程是什么

我不知道如何通过AIDL将对象从服务获取到我的活动。 我一直在使用指南,但我很困惑。谢谢

更新:

在服务连接中,我有这些行,其中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,其中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是一步一步走的

  • 我从MainActivity调用bindService(服务、连接、标志)

  • 在我调用bindService并建立连接后,会自动调用onServiceConnected。在那里,我获取IBinder,然后调用registerCallback,这会将IRemoteServiceCallback[此回调从何处来???]放入RemoteCallbackList以供以后访问

  • 现在,我注意到有两个MHandler,一个在服务中,一个在活动中。[什么时候调用它们,它们在用法上有什么区别


    现在,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);
            }
        }
    
    };