java - AIDL 是如何工作的?

标签 java android-service aidl

我正在尝试实现 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 步骤 - 根据我的理解 -。

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

  2. onServiceConnected 在我调用bindService 并建立连接后自动调用。在里面,我获取 IBinder,然后调用 registerCallback,它将 IRemoteServiceCallback[此回调来自何处?] 放入 RemoteCallbackList 中以供以后访问

现在,我注意到有两个 mHandler,一个在服务中,一个在 Activity 中。 [这些何时被称为以及它们在使用方面有何区别]

现在,RemoteCallbackList 已经有了我需要的回调,并且我可以看到在 Activity 类的 mHandler 中我终于能够获取我想要的对象了。

最佳答案

Android 中的跨应用服务基于 Binder,这是一个内核级 IPC 系统(这就是 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/

相关文章:

java - 如何处理网络状态变化时的在线媒体播放器(网络在 WiFi 或移动数据之间切换)?

android - 在 BOOTUP 上启动服务,然后安排服务每 10 分钟运行一次?

android - 向 Android.mk 添加 aidl 文件

java - 如何在卡片 View 的侧面设置颜色

java - 需要澄清 hibernate 二级缓存

android - 即使在前面运行,如何强制停止启动的进程?

android - 在 android 中每分钟启动一个服务的最佳实践是什么?

android-gradle-plugin - 解决配置 'android-aidl' 后无法创建变体 ':zoomage:debugApiElements'

java - bindService android AIDL 总是返回 false

java - 如何将两个 json 元素转换为第一个元素的名称和第二个元素的值