質問: まず三つのActivityがあり、 **TitleActivity→SelectActivity→MainActivity →** となってます。 普通に使う分にはOOMにならず、この問題点はでてこなかったのですが、色々試そうと思い上記のループを三回ぐらい行ったところMainActivityのところで画像読み込みのOOMです。 このMainActivityでは複数のインスタンスも生成しますし、画像も大量に読み込みます。 それに1ループ目でまるでエラーが出てこないあたり、何かが溜まっていっているとしか思えません。 そこで質問なんですが ***Intentはどんな感じで遷移するんでしょうか? ***今あるイメージだとインスタンス等を残したまま遷移しているように思えてなりません。 コンストラクタを呼ぶたびに溜まっていっているかんじがします。いかがでしょうか?
回答: 画面遷移を行ったときにActivityがどのように管理されるかは、公式のドキュメントがあります。 タスクとバックスタック - Android Developers APIガイド 他にも、"Android スタック"といったキーワードで調べれば、日本語による資料も多く見つけられるでしょう。 Androidでは画面遷移の順序を管理するために、スタックという後入れ先出し方式の構造を持っています。Intentで新たなActivityを呼び出すと、その情報をスタックに上積みしていきます。それは呼び出したことのあるActivityをIntentで再呼び出した場合も同様で、既にスタックに存在するActivityをフォアグラウンドに回しているわけではありません。Intentにフラグをセットして指示をすることで、既にスタックに積まれているものを全て破棄しつつ呼び出すなど特殊な制御は多々ありますが、特にフラグをセットせずに呼び出したのならば、単純に呼び出しただけスタックには情報が積み重ねられていきます。 例として、TextViewを持つActivityをIntentで2回呼び出して、一方のTextViewのテキストを書き換えても、他方のTextViewは変化しないはずです。このことからも、それらのインスタンスは独立して存在していることがわかるでしょう。そういう意味では、「呼ぶ度に溜まっているのでは」という指摘は正しいと言えるでしょう。 ただし、通常は次々と新たなActivityを呼び出してメモリーが足りなくなってくると、スタックの底の方にあるActivityを強制的に破棄するようになっています(Backキーなどで後戻りしていき、破棄されたActivityが表に出る順番になったときは、再呼び出しする仕組みになっているので、破綻することはない・・・はず)。ですから、少しずつメモリーを消費するActivityを次々と呼ぶ限りはOOMになるようなことはない・・・はずなのですが、今回の質問の内容だと一気にメモリーを消費するActivityを呼び出したため、そうした処理が間に合わずに吹っ飛んでいるのではないのでしょうか。 という推測です。 ~~構造上は上記のようなタテマエはあるものの、昔のメモリーが少ない端末なんかでは、ちょっと複雑なActivityを数回呼び出す程度でもボコボコOOMで吹っ飛んでいたような。という余談。~~