【发布时间】:2017-04-21 01:24:48
【问题描述】:
使用AIDL 有什么好处,而我们可以使用java 接口 来帮助客户端应用程序调用绑定的服务?
例如,对于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 原生接口 (JNI)
还有其他令人信服的理由使用AIDL 代替普通的 java 服务吗?
在我看来,我可以在没有任何AIDL 的情况下使用绑定和启动服务。因为这可以在 android 库中编写 java 接口作为服务器和所有客户端应用程序之间的合同。
我不打算创建本机应用程序。因此,如果AIDL 用于将 Java 服务公开给本机应用程序,那么在我的情况下使用它是否正确?我对吗?如果我误解了AIDL,请纠正我。
提前致谢
【问题讨论】:
-
如果我理解正确,你是对的,但这里的区别是你不是公开一个库而是一个后台服务,因此你需要 AIDL,以便 Android 内部可以将定义公开给所有应用程序需要它。您是否尝试过在没有 AIDL 的情况下公开服务,并且成功了?
-
“然后创建实现该接口的服务”——你可以这样做,但它没有用。在您的场景中,服务的客户端无权访问
Service对象。 “根据维基百科”——维基百科是不正确的,因为 AIDL 与 JNI 关系不大。 “而不是普通的java服务?” -- 什么是“普通的 java 服务”? “在我看来,我可以在没有任何 AIDL 的情况下使用绑定和启动服务。” -- 在一个进程内,是的,但不是跨进程。 -
顺便说一句,process1 服务与 process2 活动通信的另一种方式是通过洞穴人文件。