我应该使用AIDL吗?

时间:2016-12-06 11:55:26

标签: android idl aidl

使用 java接口来帮助客户端应用程序调用绑定服务时使用AIDL有什么好处?

例如,对于ITestService,我们应该创建一个AIDL,如下所示:

// ITestService.aidl
package com.varanegar.vaslibrary.service;

// Declare any non-default types here with import statements

interface ITestService {
    /**
     * Demonstrates some basic types that you can use as parameters
     * and return values in AIDL.
     */
    void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,
        double aDouble, String aString);
    int test();
}

然后我们应该实现生成的Stub类:

public class TestService extends Service {
    public class TestImpl extends ITestService.Stub{

        @Override
        public void basicTypes(int anInt, long aLong, boolean aBoolean, 
           float aFloat, double aDouble, String aString) throws RemoteException {

        }

        @Override
        public int test() throws RemoteException {
            return 0;
        }
    }
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return new TestImpl();
    }
}

虽然,我相信我们可以轻松创建这样的java界面:

interface ITestService {
    int test();
}

然后创建实现该接口的服务:

public class TestService extends Service implements ITestService {
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public int test() {
        return 0;
    }
}

根据维基百科:

  

AIDL:基于Java,适用于Android;支持本地和远程过程   可以通过调用从本机应用程序访问   Java Native Interface(JNI)

是否还有其他令人信服的理由使用AIDL代替普通的Java服务?

在我看来,我可以在没有AIDL的情况下使用绑定和启动的服务。因为这可以在android库中编写java接口作为服务器和所有客户端应用程序之间的契约。

我不打算创建本机应用程序。因此,如果使用AIDL将Java服务公开给本机应用程序,那么在我的情况下使用它是否正确?我对吗?如果我误解了AIDL,请纠正我。

提前致谢

3 个答案:

答案 0 :(得分:2)

来自documentation

  

仅当您允许来自不同应用程序的客户端访问IPC服务并希望在您的服务中处理多线程时,才需要使用AIDL。如果您不需要跨不同的应用程序执行并发IPC,则应该通过implementing a Binder创建接口,或者,如果要执行IPC,但是需要处理多线程,请实现界面using a Messenger。无论如何,请确保在实施AIDL之前了解Bound Services

答案 1 :(得分:1)

顺便说一句,process1服务与process2活动进行通信的另一种方式是通过穴居人文件。服务写入一个文件。活动读取文件并响应另一个文件上的服务。在文件上调用文件读取循环,该循环应阻塞直到将字节写入文件。在单独的线程上执行此操作。

答案 2 :(得分:0)

AIDL不执行任何操作,而是让系统生成隐藏活页夹IPC详细信息的样板代码,以便您可以将远程服务API作为本地方法调用来调用。因此,

  1. 如果不需要IPC(即,您的客户端和服务器位于同一位置 流程),则不需要AIDL;

  2. 如果要为IPC自己编写样板代码,则不需要AIDL。

  3. 如果您的服务不够复杂(即不需要并发多线程访问),则可以使用系统提供的IPC Messenger API。您不需要自己的AIDL,因为Messenger API隐藏了AIDL的用法;

  4. 要扩展情况3,如果可以使用任何现有的lib或现有的API在另一个进程中访问服务,则不需要自己的AIDL。例如,您可以使用现有系统API访问ActivityManagerService,并且系统API隐藏IActivityManager的所有AIDL内容。