- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
Android AIDL 是否支持泛型?
例如,假设我有一个类 Result<T>
,其中 T 可以是任何类型,包括基元(通过自动装箱)或其他自定义类,例如 Car
.任何自定义类实现 Parcelable
根据 Binder 的要求。
然后可能的 AIDL 方法签名将是
Result<Car> m1();
Result<Void> m2();
Result<Boolean> m3();
最佳答案
据我所知,AIDL 编译器不喜欢 Result<Animal> getResult();
之类的东西.然而,Result getResult();
确实有效。所以这就是我所做的:
public class Result<T extends Parcelable> implements Parcelable
.public class Animal implements Parcelable
.Parcelable
和一个 CREATOR
在 Result 和 Animal 中,还根据需要为每个创建了一个 AIDL,并在主 AIDL 中导入了这两个类。这些东西是常规的 AIDL 工作,在 AIDL site 中有描述。 .Result
,我们不仅存储类型为 T
的对象还有一个Class
目的。在编写 parcel 时,我们需要先编写类类型,然后才编写通用对象。阅读时,我们按照相同的顺序进行。我们需要写类类型,因为当我们阅读时我们必须做 t = (T) in.readValue(classType.getClassLoader());
没有类类型我们 do not know要获取哪个类加载器。可能还有其他方法可以做到这一点,但我在这个例子中就是这样做的。Result<Animal> r = MainActivity.this.service.getResult();
然后在 Result
上调用方法和 Animal
.可以在下面找到一些有望使事情更清晰的代码。
public class Result<T extends Parcelable> implements Parcelable {
private String msg;
private Class classType;
private T value;
public Result(String msg, T value, Class classType) {
this.msg = msg;
this.value = value;
this.classType = classType;
}
// to reconstruct object
public Result(Parcel in) {
readFromParcel(in);
}
public String getMsg() {
return msg;
}
public T getValue() {
return value;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(msg);
dest.writeValue(classType);
dest.writeValue(value);
}
private void readFromParcel(Parcel in) {
this.msg = in.readString();
this.classType = (Class) in.readValue(Class.class.getClassLoader());
this.value = (T) in.readValue(classType.getClassLoader());
}
public static final Creator<Result> CREATOR = new Creator<Result>() {
@Override
public Result createFromParcel(Parcel source) {
return new Result(source);
}
@Override
public Result[] newArray(int size) {
return new Result[size];
}
};
}
public class Animal implements Parcelable {
private int n;
public Animal(int n) {
this.n = n;
}
public Animal(Parcel in) {
readFromParcel(in);
}
public int getN() {
return n;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(n);
}
private void readFromParcel(Parcel in) {
n = in.readInt();
}
public static final Creator<Animal> CREATOR = new Creator<Animal>() {
@Override
public Animal createFromParcel(Parcel source) {
return new Animal(source);
}
@Override
public Animal[] newArray(int size) {
return new Animal[size];
}
};
}
服务摘录:
@Override
public Result getResult() throws RemoteException {
Result<Animal> r = new Result<Animal>("this is an animal", new Animal(42), Animal.class);
return r;
}
客户摘录:
Result<Animal> r = MainActivity.this.service.getResult();
Log.d(TAG, "Received the following (Outer): " + r.getMsg());
Log.d(TAG, "Received the following (Inner): " + r.getValue().getN());
另一种方法是更改 Result
的签名进入public class Result<T extends Serializable> implements Parcelable
, 制作 Animal
实现 Serializable
, 然后使用 dest.writeSerializable(value);
和 this.value = (T) in.readSerializable();
里面的结果。
使用这种方法,不需要将类类型发送到另一端,甚至根本不需要使用它。尽管如此,您还是要支付 price .
关于java - 带有 Java 泛型的 Android AIDL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28052195/
我正在尝试使用 aidls 构建一个库。 LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := test LOCAL_SR
我下载了 android 源代码,试图了解 stub 类在 android 电话系统中的工作原理,所以我使用 aidl convert ITelephony.aidl 但它给我错误,例如: 找不到类
首先,这可能是重复的,但我搜索了大量时间试图修复此错误,但找到的有关此主题的页面都没有帮助我修复错误。以下是我去过的一些地方: Android: AIDL refusing to generate c
我想知道AIDL中的inout参数是做什么用的? 我知道什么是进来的,什么是出去的。 (out 不会编码(marshal)传递的对象)。 但我不明白 inout 是做什么用的。 我查看了: "In/o
我正在尝试实现 AIDL,但我只是不明白它是如何工作的。我的意思是方法调用的进展是什么? 我不明白如何通过 AIDL 将对象从服务获取到我的 Activity 。我一直用google docs寻求指导
我正在应用程序中实现计费,但在构建项目时出现以下错误。 C:\Users\user\AndroidStudioProjects\Blessd\app\src\main\aidl\IInAppBilli
我的 AIDL 文件中有一个函数 int getAvailableTokens(out List list); 我想从主类调用这个函数并作为参数给出 List mylist为了功能将设置它。我该怎么做
我想在我的应用程序中试用 android m 预览。我已经下载了最新的构建工具和 m 平台。我已将其包含在我的 build.gradle 文件(模块应用程序)中: compileSdkVersion
我在我的项目中使用 AIDL,我有两个 apk:AIDLServer 和 AIDLClient。 AIDLServer中目前还没有Activity(只有服务),但是有些操作需要用户的许可(比如蓝牙,L
我必须让其他开发人员能够连接到我的服务,但我的 AIDL 导入了我的类。我不想给他们服务的源代码,只是 APK 和某种 stub 文件(java、jar?)。我怎样才能给他们一些东西 - “胶水” -
我正在研究 AIDL。我的 .aidl 文件在另一个项目(另一个应用程序)中。假设 aidl 文件名为 IService.aidl。但是在分配 IService service = IService.
我有一个 AIDL 文件,我想在其中返回一个整数列表。简单的喜欢: interface blah { List getSubscriptionsForUser(int user); } 但我不
我一直在尝试将 IPC 用于多 apk 项目。 其中一个公开了一个有很多方法的服务。其中一些方法将 Parcelable 对象作为参数(或返回它们)。 我做的第一件事是为我的服务创建一个 aidl 文
当应用程序使用 AIDL 调用远程服务时,是否提供任何安全措施?还是仅仅是恶意应用程序可以读取数据? 最佳答案 在Android上,一个进程不能正常访问另一个进程的内存。 当您绑定(bind)到具有
正在尝试编译在 Android repo 中找到的 AIDL 文件与我的 Android 项目一起使用一些内置接口(interface)。 但是,每当我访问内部类型时,我都会收到以下错误: ITune
使用 aidl 与广播接收器在应用程序之间发送消息(用于后台和前台处理)的优缺点是什么?我一直在使用接收器,由于带有 Intent 过滤器的订阅模型以及易用性/可扩展性,这很好。将这种方法用于 VS
要求:需要将来自不同进程的服务/契约(Contract)公开给其他应用。例如:getPhoneRecord(recordId)、deletePhoneRecord(phoneId)等 可能的解决方案:
我真的很感激任何帮助来解决这个问题:我有一个 svn trunk 项目和一个 svn-bracnch。两者都已 checkout ,并从中创建了一个不同的 Eclipse 工作空间。 我可以毫无错误地
在我们可以使用java接口(interface)帮助客户端应用程序调用绑定(bind)服务的同时,使用AIDL有什么优势? 例如,对于ITestService,我们应该创建一个AIDL,如下所示: /
要了解android中的AIDL,我想要一个真实的例子,意思是我们需要在什么开发场景下使用AIDL。 通过阅读 Android 文档 ...它让我感到困惑和很多问题,所以很难为我阅读整个文档,任何人都
我是一名优秀的程序员,十分优秀!