「Xamarin.Androidで巨大なデータをActivity間で引き渡す」の版間の差分

提供: MonoBook
ナビゲーションに移動 検索に移動
 
(同じ利用者による、間の1版が非表示)
1行目: 1行目:
Androidのアクティビティ間で[[ビットマップ]]などの巨大な[[データ]]を引き回したい時にインテントではサイズ制限で落ちる機種が存在する。
+
Androidのアクティビティ間で[[ビットマップ]]などの巨大な[[データ]]を引き回したい時にインテントではサイズ制限でクラッシュする機種が存在する。なお「インテントの上限値」は機種ごとに異なるようで同じデータでも落ちる機種と落ちない機種があるようだ。
インテントの上限値は機種ごとに異なるようで同じデータでも落ちる機種と落ちない機種があるようだ。
 
  
 
そういうときはApplicationクラスを拡張してデータ共有用のプロパティを用意すればいいらしい。
 
そういうときはApplicationクラスを拡張してデータ共有用のプロパティを用意すればいいらしい。
54行目: 53行目:
  
 
== 関連項目 ==
 
== 関連項目 ==
* [[Xamarin.Android/ディスプレイをスリープさせない]]
+
* [[Xamarin.Androidでディスプレイをスリープさせない]]
 
 
== 参考文献 ==
 
{{reflist}}
 
  
 
[[category: Xamarin.Android]]
 
[[category: Xamarin.Android]]

2021年4月20日 (火) 07:12時点における最新版

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

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