使用 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
,请纠正我。
提前致谢
答案 0 :(得分:2)
仅当您允许来自不同应用程序的客户端访问IPC服务并希望在您的服务中处理多线程时,才需要使用AIDL。如果您不需要跨不同的应用程序执行并发IPC,则应该通过implementing a Binder创建接口,或者,如果要执行IPC,但是不需要处理多线程,请实现界面using a Messenger。无论如何,请确保在实施AIDL之前了解Bound Services。
答案 1 :(得分:1)
顺便说一句,process1服务与process2活动进行通信的另一种方式是通过穴居人文件。服务写入一个文件。活动读取文件并响应另一个文件上的服务。在文件上调用文件读取循环,该循环应阻塞直到将字节写入文件。在单独的线程上执行此操作。
答案 2 :(得分:0)
AIDL不执行任何操作,而是让系统生成隐藏活页夹IPC详细信息的样板代码,以便您可以将远程服务API作为本地方法调用来调用。因此,
如果不需要IPC(即,您的客户端和服务器位于同一位置 流程),则不需要AIDL;
如果要为IPC自己编写样板代码,则不需要AIDL。
如果您的服务不够复杂(即不需要并发多线程访问),则可以使用系统提供的IPC Messenger API。您不需要自己的AIDL,因为Messenger API隐藏了AIDL的用法;
要扩展情况3,如果可以使用任何现有的lib或现有的API在另一个进程中访问服务,则不需要自己的AIDL。例如,您可以使用现有系统API访问ActivityManagerService,并且系统API隐藏IActivityManager的所有AIDL内容。