解説
Android7.1以降、ActivityやFragmentにシリアライズ化(Serializableインターフェースを実装)されたオブジェクトを渡せなくなる状況が発生している。これを回避するために、BundleにParcelableインターフェースを実装したオブジェクトを渡して回避する方法を示す。
Android7.1.1まではテスト済み。
そもそもの原因は、シリアライズ化されたデータを渡すのではなく、Serializableインターフェースを実装したオブジェクトを渡してしまうことにある。
もし、そうであるなら、逆に、不具合が解消されたと考えるべきである。
数個程度の単純なデータ(基本のデータ型)を渡すだけなら、直接そのデータを渡した方が良い。
更新日:2016年11月30日
アノテーションの活用
自身で、Parcelableインターフェースを実装してクラスを作成することもできるが、
簡単にするために、アノテーション・ライブラリを使用するための定義を行う。
dependencies
{
compile "org.parceler:parceler-api:1.0.3"
apt "org.parceler:parceler:1.0.3"
}
受け渡し用のクラス定義
@Parcel
public class ParcelableData extends RealmObject implements Serializable
{
protected String title;
public ParcelableData() { super(); }
public String getTitle()
{
return title;
}
public void setTitle( String title )
{
this.title = title;
}
}
上記では、Realmを継承し、Serializableインターフェースを実装したものを想定している。
Intentの作成方法
ParcelableData pData; // 予め用意する
Bundle bundle = new Bundle();
Intent intent = new Intent( getApplicationContext(), 受け渡し用クラス.class );
bundle.putParcelable( "任意キー1", Parcels.wrap( pData ) );
intent.putExtra( "任意キー2", bundle );
ただし、送受信環境で合わせる必要があることは当然である。
Intentからの受取方法
Bundle bundle = intent.getBundleExtra( "任意キー2" );
ParcelableData data = (ParcelableData)Parcels.unwrap( bundle.getParcelable( "任意キー1" ) );
ただし、送受信環境で合わせる必要があることは当然である。