メインメニューを開く

差分

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

2,117 バイト追加, 2017年4月17日 (月) 07:52
ページの作成:「Androidのアクティビティ間でビットマップなどの巨大なデータを引き回したい時にインテントではサイズ制限で落ちる機...」
Androidのアクティビティ間で[[ビットマップ]]などの巨大な[[データ]]を引き回したい時にインテントではサイズ制限で落ちる機種が存在する。
インテントの上限値は機種ごとに異なるようで同じデータでも落ちる機種と落ちない機種があるようだ。

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

Applicationクラスを拡張する基本はこの説明がわかりやすい。
Xamarin.Android でオレオレ Application クラスを使う
http://qiita.com/amay077/items/0aa8cbfe2eddda399378

Applicationクラスを拡張したクラスを作った後は普通にパブリックなプロパティを追加すればよい。
なお、Androidの流儀ではOnTerminate呼び出し時に明示的にメモリ解放すべきらしい。
<source lang="csharp">
[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();
}
}
</source>

呼び出し側
<source lang="csharp">
var app = (MyApplication)this.Application;
app.RawData = rawData;

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

受け取り側
<source lang="csharp">
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);
}
</source>

== 関連項目 ==
* [[Xamarin.Android/ディスプレイをスリープさせない]]

== 参考文献 ==
{{reflist}}

[[category: Xamarin.Android]]
匿名利用者