解説

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;
	}
}

上記のように、既存のクラスに「@Parcel」アノテーションを追加するだけで、コードを修正する必要はない。
上記では、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 );

なお、上記で示している任意キー「1」と「2」は、この場合、同じでも問題はない。
ただし、送受信環境で合わせる必要があることは当然である。

Intentからの受取方法



Bundle bundle = intent.getBundleExtra( "任意キー2" );
ParcelableData data = (ParcelableData)Parcels.unwrap( bundle.getParcelable( "任意キー1" ) );

なお、上記で示している任意キー「1」と「2」は、この場合、同じでも問題はない。
ただし、送受信環境で合わせる必要があることは当然である。

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.