Android1.x系列のIntent不具合について

もしくははじめから仕様として設計されてるのかもしれないけど、巨大なメモリをIntentで扱った場合のAndroidの挙動不審についてメモ書き。


ShakeDroidの画像トリミングは標準の画像トリミングActivityを呼んで、切り取った画像をIntentで受け取ることで実現しています。

しかし、高解像度で画像をやり取りしようとすると、本来
startActivityForResult() -> onActivityResult() -> onRestart()
の順で呼ばれるはずのライフサイクルが
startActivityForResult() -> onRestart()
って感じでonActivityResult()をスルーしてしまうようです。

ShakeDroidの「メモリ節約」はこの挙動を回避するために設けられています。

理想は受け取る画像解像度=画面解像度。無駄な画像加工は画質を落とすだけなので内部的になるべく避ける方向で実装してあります。
ただし、その方法で画像を受け取るには、Intentでかなりの大きさのBMPデータをやり取りしなければなりません。
試算すると、ビット深度・RGBA8888 × 854 × 480 ≒ 1.6MB。
ビット深度はトリミングActivityのソースコードを見る限りRGBA8888で固定です。

ここから先はSHARPの方に問い合わせた結果わかったことですが、Intentのデータをやり取りするために扱えるメモリが約100KBらしいです。
参考URL:
http://groups.google.co.jp/group/android-developers/browse_thread/thread/866301365d7a353d

それを超える値(どの程度が限界かは、おそらく端末ごと・ドライバごとに違います)は正常にやりとりが行えません。

アプリ側が出来ることは、可能な限りIntentでやり取りするデータを軽量化すること。

ShakeDroidの場合は画像をファイルとして保存してもらうことで回避する方向です(個人的に、一時ファイルを置くのは非常に気持ち悪い動作なのですが・・・)


巨大なデータをIntentの連携で扱うアプリの場合、Intentの挙動に気を配ったほうがよさそうです。