異なるパッケージのいくつかのサービスで共通のオブジェクトを共有しようとしています。各サービスは同じオブジェクトを呼び出す必要があります。
たとえば、サービス A (APK A から) がカスタム オブジェクトをインスタンス化し、サービス B と C (APK B と C から) がこのオブジェクトの参照を取得して、そのメソッドを呼び出すようにしたいとします。
Android リファレンスで、 Parcelを使用することで可能であることがわかりました。
アクティブなオブジェクト
Parcel の珍しい機能は、アクティブなオブジェクトを読み書きできることです。これらのオブジェクトの場合、オブジェクトの実際の内容は書き込まれず、オブジェクトを参照する特別なトークンが書き込まれます。パーセルからオブジェクトを読み取るとき、オブジェクトの新しいインスタンスを取得するのではなく、最初に書き込まれたオブジェクトとまったく同じオブジェクトを操作するハンドルを取得します。使用可能なアクティブ オブジェクトには 2 つの形式があります。
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);
}
}
誰かがすでにそれを行っていますか?
前もって感謝します !