Xamarin.Androidで巨大なデータをActivity間で引き渡す

提供: MonoBook
ナビゲーションに移動 検索に移動

Androidのアクティビティ間でビットマップなどの巨大なデータを引き回したい時にインテントではサイズ制限でクラッシュする機種が存在する。なお「インテントの上限値」は機種ごとに異なるようで同じデータでも落ちる機種と落ちない機種があるようだ。

そういうときはApplicationクラスを拡張してデータ共有用のプロパティを用意すればいいらしい。

Applicationクラスを拡張する基本はこの説明がわかりやすい。

Xamarin.Android でオレオレ Application クラスを使う
http://qiita.com/amay077/items/0aa8cbfe2eddda399378

Applicationクラスを拡張したクラスを作った後は普通にパブリックなプロパティを追加すればよい。 なお、Androidの流儀ではOnTerminate呼び出し時に明示的にメモリ解放すべきらしい。XamarinだとGCが勝手にやってくれそうな気もするがJavaの流儀に合せておく。

    [Application]
    public class MyApplication : Application
    {
        public byte[] RawData { get; set; }

        public MyApplication(IntPtr javaReference, JniHandleOwnership transfer)
            : base(javaReference, transfer)
        {
        }

        public override void OnTerminate()
        {
            RawData = null;
            base.OnTerminate();
        }
    }

呼び出し側

            var app = (MyApplication)this.Application;
            app.RawData = rawData;

            var intent = new Intent(this, typeof(Activity2));
            //intent.PutExtra("RawData",rawData);
            StartActivity(intent);

受け取り側

        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);

            var app = (MyApplication)this.Application;
            var rawData = app.RawData;

            //var intent = this.Intent;
            //var rawData = intent.GetIntExtra("RawData", null);
	}

関連項目[編集 | ソースを編集]