2

2 つのプロセス間でアクティブなオブジェクトを共有することを検討していますが、それに関するドキュメントはしばしば光沢がなく、間違っていることさえあります。

具体的には、パーセルを介して Binder オブジェクトを共有することを検討していました。ドキュメントの状態。

アクティブなオブジェクト

Parcel の珍しい機能は、アクティブなオブジェクトを読み書きできることです。これらのオブジェクトの場合、オブジェクトの実際の内容は書き込まれず、オブジェクトを参照する特別なトークンが書き込まれます。パーセルからオブジェクトを読み取るとき、オブジェクトの新しいインスタンスを取得するのではなく、最初に書き込まれたオブジェクトとまったく同じオブジェクトを操作するハンドルを取得します。使用可能なアクティブ オブジェクトには 2 つの形式があります。

Binder オブジェクトは、Android の一般的なクロスプロセス通信システムのコア機能です。IBinder インターフェイスは、Binder オブジェクトを使用して抽象プロトコルを記述します。そのようなインターフェースはすべてパーセルに書き込むことができ、読み取ると、そのインターフェースを実装する元のオブジェクト、または元のオブジェクトへの呼び出しを通信する特別なプロキシ実装のいずれかを受け取ります。使用するメソッドは、writeStrongBinder(IBinder)、writeStrongInterface(IInterface)、readStrongBinder()、writeBinderArray(IBinder[])、readBinderArray(IBinder[])、createBinderArray()、writeBinderList(List)、readBinderList(List)、createBinderArrayList() です。 .

ただし、パーセルを受け取ったときに返されるオブジェクトは単なる BinderProxy であり、元のクラスにキャストしたり、基本的な IBinder 呼び出し以外の呼び出しを実装したりすることはできません。これは明らかにドキュメントで言及されているプロキシ オブジェクトですが、同じステートメントでほのめかされた元のオブジェクトを参照するためのメソッドが何であるかを知りたいと思っていました。

また、このトピックがより完全に説明または文書化されているソースがあるかどうかも疑問に思っていました.

4

1 に答える 1

-2

Parcelable インターフェースを正しく実装していれば、オブジェクトを元のクラスにキャストできるはずです。キャストは次のようになります。

// in ProcessDataActivity retrieve User 
Intent intent = getIntent();
ParcelableObjectExample usr = (ParcelableObjectExample)
     intent.getParcelableExtra("parcelableExample");

これを成功させるには、ParcelableObjectExample に Parcelable インターフェースを正しく実装する必要があります。そのためには、次のことを行う必要があります。

  1. その describeContents メソッドを実装する
  2. オブジェクトの現在の状態を取り、それをパーセルに書き込む抽象メソッド writeToParcel を実装します。
  3. Parcelable.Creator インターフェイスを実装するオブジェクトである CREATOR という静的フィールドをクラスに追加します。
  4. Parcel をパラメーターとして受け取るコンストラクターを追加します。CREATOR はそのコンストラクターを呼び出して、オブジェクトを再構築します。
于 2015-09-14T14:32:22.923 に答える