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

提供: MonoBook
2017年4月17日 (月) 08:22時点における103.22.200.102 (トーク)による版
ナビゲーションに移動 検索に移動

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

関連項目

参考文献