「Xamarin.Androidで巨大なデータをActivity間で引き渡す」の版間の差分
Administrator (トーク | 投稿記録) 細 Administrator がページ「Xamarin.Android/巨大なデータをActivity間で引き渡す」を「Xamarin.Androidで巨大なデータをActivity間で引き渡す」に移動しました |
Administrator (トーク | 投稿記録) 編集の要約なし |
||
| 1行目: | 1行目: | ||
Androidのアクティビティ間で[[ビットマップ]]などの巨大な[[データ]] | Androidのアクティビティ間で[[ビットマップ]]などの巨大な[[データ]]を引き回したい時にインテントではサイズ制限でクラッシュする機種が存在する。なお「インテントの上限値」は機種ごとに異なるようで同じデータでも落ちる機種と落ちない機種があるようだ。 | ||
そういうときはApplicationクラスを拡張してデータ共有用のプロパティを用意すればいいらしい。 | そういうときはApplicationクラスを拡張してデータ共有用のプロパティを用意すればいいらしい。 | ||
| 54行目: | 53行目: | ||
== 関連項目 == | == 関連項目 == | ||
* [[Xamarin. | * [[Xamarin.Androidでディスプレイをスリープさせない]] | ||
[[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);
}