なぜこれが起こっているのかはわかりますが、あなたはそれを気に入らないでしょう;-)
まず、背景情報を少し説明します。
のエクストラは、基本的にキーと値のペアでIntent
ある Androidです。だからあなたが何かをするときBundle
HashMap
intent.putExtra(AppConstants.KEY_ITEMS, items);
Android はエクストラ用に新しいものを作成し、キーがあり、値が項目(LinkedList オブジェクト) でBundle
ある場所にマップ エントリを追加します。Bundle
AppConstants.KEY_ITEMS
これで問題ありません。コードの実行後にエクストラ バンドルを確認すると、LinkedList
. 興味深い部分は次のとおりです...
エクストラを含むインテントで呼び出す場合startActivity()
、Android はキーと値のペアのマップからエクストラをバイト ストリームに変換する必要があります。基本的にBundleをシリアル化する必要があります。別のプロセスでアクティビティを開始する可能性があるため、これを行う必要があります。そのためには、新しいプロセスでオブジェクトを再作成できるように、バンドル内のオブジェクトをシリアル化/逆シリアル化する必要があります。また、後で必要になった場合に Intent を再生成できるように、Android は一部のシステム テーブルに Intent の内容を保存するため、これを行う必要があります。
をバイト ストリームにシリアル化するためにBundle
、バンドル内のマップを調べて、各キー/値のペアを取得します。次に、各「値」(オブジェクトの一種) を取得し、最も効率的な方法でシリアル化できるように、そのオブジェクトの種類を判別しようとします。これを行うために、既知のオブジェクト タイプのリストに対してオブジェクト タイプをチェックします。「既知のオブジェクト タイプ」のリストにはInteger
、Long
、String
、Map
、Bundle
残念ながら も含まれていますList
。そのため、オブジェクトがList
( を含むさまざまな種類があるLinkedList
) である場合、それをシリアル化し、 type のオブジェクトとしてマークしますList
。
がデシリアライズされるときBundle
、つまり: これを行うとき:
LinkedList<Item> items = (LinkedList<Item>)
getIntent().getSerializableExtra(AppConstants.KEY_ITEMS);
のタイプArrayList
のすべてのオブジェクトを生成します。Bundle
List
Android のこの動作を変更するためにできることは実際には何もありません。少なくともこれで、なぜこれを行うのかがわかります。
ご存知のように、私は実際にこの動作を検証する小さなテスト プログラムを作成し、マップをバイト ストリームに変換するときにParcel.writeValue(Object v)
呼び出されるメソッドのソース コードを調べました。Bundle
重要な注意:List
はインターフェースであるため、これは、 に配置したものを実装するすべてのクラスがとしてList
出力Bundle
されることを意味しますArrayList
。が「既知のオブジェクト タイプ」のリストに含まれていることも興味深い点Map
です。これは、どの種類のMap
オブジェクトを に入れてもBundle
(たとえばTreeMap
、 、またはインターフェイスSortedMap
を実装する任意のクラス)、常に から を取得することを意味します。それ。Map
HashMap