【发布时间】:2013-05-21 23:58:54
【问题描述】:
我正在尝试为不同包中的多个服务共享一个公共对象。每个服务必须调用相同的对象。
例如,服务 A(来自 APK A)实例化了一个自定义对象,我希望服务 B 和 C(来自 APK B 和 C)检索此对象的引用并调用它的某些方法。
我在 Android 参考资料中发现使用 Parcel 应该是可能的:
活动对象
Parcel 的一个不同寻常的功能是能够主动读写 对象。对于这些对象,对象的实际内容不是 写入,而是写入引用对象的特殊标记。 从包裹中读取对象时,您不会得到新的 对象的实例,而是一个对确切的操作的句柄 与最初编写的对象相同。有两种形式的活动 可用的对象。
Binder 对象是 Android 通用跨进程的核心工具 通讯系统。 IBinder 接口描述了一个抽象 带有Binder对象的协议。任何这样的接口都可以写入 一个包裹,阅读后您将收到原始物品 实现该接口或特殊的代理实现 将调用传递回原始对象。使用的方法是 writeStrongBinder(IBinder), writeStrongInterface(IInterface), readStrongBinder(), writeBinderArray(IBinder[]), readBinderArray(IBinder[]), createBinderArray(), writeBinderList(List)、readBinderList(List)、createBinderArrayList()。
我尝试通过 AIDL 传递我的对象(扩展活页夹)来做到这一点,但没有任何效果,当我尝试从方法 createFromParcel(Parcel in) 检索引用时,我总是收到 ClassCastException。
我的代码示例:
public class CustomObject extends Binder implements Parcelable {
public CustomObject() {
super();
}
public static final Parcelable.Creator<CustomObject> CREATOR = new Parcelable.Creator<CustomObject>() {
public CustomObject createFromParcel(Parcel in) {
IBinder i = in.readStrongBinder();
// HOW TO RETRIEVE THE REFERENCE ??
return null;
}
@Override
public CustomObject[] newArray(int size) {
return null;
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeStrongBinder(this);
}
}
有人已经这样做了吗?
提前致谢!
【问题讨论】:
-
你有没有想过如何做到这一点?几年前我尝试过并放弃了。现在我再次尝试解决与您相同的问题/结果。
-
不幸的是,没有。对于这个项目,我更改了我的流程,以便在每次我想调用对象上的方法时检索对象的副本。不完美,但它正在工作。但我仍然很想知道这个问题是否有解决方案
标签: android android-service aidl android-binder