Xamarin.Androidで巨大なデータをActivity間で引き渡す
2021年4月20日 (火) 07:11時点におけるAdministrator (トーク | 投稿記録)による版 (Administrator がページ「Xamarin.Android/巨大なデータをActivity間で引き渡す」を「Xamarin.Androidで巨大なデータをActivity間で引き渡す」に移動しました)
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);
}