AIDL如何运作?

ben*_*ill 2 java aidl android-service

我正在尝试实现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();
        }
Run Code Online (Sandbox Code Playgroud)

这是registerCallback,其中mCallbacks是一个

final RemoteCallbackList <IRemoteServiceCallback> mCallbacks

    = new RemoteCallbackList <IRemoteServiceCallback> ();
Run Code Online (Sandbox Code Playgroud)

.....

public void registerCallback(IRemoteServiceCallback callback)
                throws RemoteException {
            if(callback != null){
                mCallbacks.register(callback);
            }

        }
Run Code Online (Sandbox Code Playgroud)

IRemoteServiceCallback(mCallback)的唯一方法是:

public void valueChanged(int value) {
        mHandler.sendMessage(mHandler.obtainMessage(BUMP_MSG, value, 0));
    }
Run Code Online (Sandbox Code Playgroud)

我也有一个处理程序,但我不太清楚该怎么做:

 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);
        }
    }

};
Run Code Online (Sandbox Code Playgroud)

更新2:

AIDL步骤 - 从我的理解 - .

  1. 我从MainActivity调用bindService(service,connection,flags)

  2. 在调用bindService并建立连接后,将自动调用onServiceConnected.在那里,我得到IBinder,然后调用registerCallback,它放置一个IRemoteServiceCallback [ 这个CALLBACK来自哪里?]进入RemoteCallbackList以供以后访问

现在,我注意到有两个mHandler,一个在服务中,一个在活动中.[ 当这些被呼叫时,它们之间的区别在于它们的使用条件 ]

现在,RemoteCallbackList具有我需要的回调,我可以看到,在活动类的mHandler中,我能够最终得到我想要的对象.

Del*_*yan 9

Android中的跨应用程序服务基于Binder,这是一个内核级IPC系统(这是IBinder类名来源).绑定到远程服务(即应用程序外部的服务)时,它可以向您返回一个对象.但是,由于您不知道实际类型是什么(方法,字段等),因此无法将其转换为可用类型.

这就是AIDL的用武之地 - 它是一种与语言无关的指定接口的方式 - 方法及其参数的集合(它看起来也像Java一样 - 但事实并非如此).如果客户端和服务器都使用相同的.aidl文件,则可以通过生成的Java接口绑定到对象 - IRemoteService.Stub.asInterface(obj).在服务方面,你只需要用某种语言实现相同的接口(框架中的一些服务是用C++编写的),IPC机制将负责其余的工作.

也就是说,除非您导出服务并希望外部应用程序能够使用它,否则您不需要使用AIDL.如果没有,只需在您的应用程序中实现IBinder并onServiceConnected直接转换收到的对象,因为您知道它的类型.