1. ホーム
  2. android

[解決済み] バンドルでオブジェクトを送信する方法

2022-08-14 19:14:18

質問

バンドルを通して、処理の大部分を行うクラスへの参照を渡す必要があります。

問題は、それがインテントやコンテキストとは何の関係もなく、大量の非プリミティブオブジェクトを持っていることです。クラスをパーセラブル/シリアライザブルにパッケージ化し、それを startActivityForResult ?

どのように解決するのですか?

どのような道を歩むべきかを考えるには、コモンズウェアの重要な問いである「なぜ」だけでなく、「何に対して」それを渡すのかという問いに答える必要があります。

現実には、バンドルを通して渡すことができるのはプレーンなデータだけで、他のすべてはそのデータが意味するもの、あるいは指し示すものについての解釈に基づいています。 文字通りオブジェクトを渡すことはできませんが、できることは3つのうちの1つです。

1) オブジェクトをその構成データに分解することができ、相手側に同じ種類のオブジェクトの知識がある場合、シリアル化されたデータからクローンを組み立てることができます。 一般的な型のほとんどは、この方法でバンドルを通過します。

2) 不透明なハンドルを渡すことができます。 同じコンテキスト内でそれを渡している場合 (なぜ気にするのかと聞かれるかもしれませんが)、それは呼び出したり参照解除したりできるハンドルになります。 しかし、Binderを経由して別のコンテキストに渡すと、リテラル値は任意の数字になる(実際、これらの任意の数字は起動時から順次カウントされる)。 元のコンテキストに渡すと、Binder がこれを元のハンドルに変換して再び使えるようにするまで、何もできません。

3) ファイル記述子や特定の Os/ プラットフォーム オブジェクトへの参照などのマジック ハンドルを渡すことができ、正しいフラグを設定すると、Binder は受信者のために同じリソースを指すクローンを作成し、相手側で実際に使用することができます。 しかし、これは非常に少数のタイプのオブジェクトに対してのみ機能します。

ほとんどの場合、相手側がそれを追跡して後で返すことができるようにクラスを渡しているか、シリアライズされた構成データからクローンを作成できるコンテキストに渡しているか...さもなければ、うまくいかないことをやろうとしているので、アプローチ全体を見直す必要があります。