Androidの○○仕様『WIN DEATH』に嵌められた件

『WIN DEATH』とは
↓以下のようなログを残してAndroid OSがActivityを再起動する処理
06-28 15:01:00.215: I/WindowManager(268): WIN DEATH: Window{2b3dd968 com.android.settings/com.android.settings.Settings paused=false}



これがいろいろとやっかいである。

・プロセスはkillされ、いったんメモリはクリアされる。
・アプリケーションの起動Activity以外のActivityをTopにしていても、メインではないそのActivityだけ復帰を要求される(メモリはクリアされる)
・onStop()、onSaveInstanceState()などサスペンド時に発生するイベントではなく、レジューム時に発生し、イベントはonCreate()で来る。
・onStop()でアプリを破棄すれば対策は簡単だが、ちょっとホームに戻っただけでアプリを閉じる面倒くさいアプリができる。
・onSaveInstanceState()で保存出来れば良いのだが、アプリの全部の状態を保存するなんてめんどくさいだろ。
・プロセスがkillされるので、デバッガが切断されてしまい、デバッガで追うことができない。
・なぜかログ出力もされない(原因不明)
・意外と再現が難しい。ただホームに戻るだけでは発生しない。(機内モードをON/OFFするとわりと出る)




<<<対策>>>

↓メインで起動するActivityにこれを書くだけ。

android:clearTaskOnLaunch="true"


・これでメイン以外のActivityから起動しなくなります。

・ちょっとした一時停止ではWIN DEATHが発生しないので再起動もしない。

・AndroidManifest.xmlに書くべし。




<<<参考>>>

Activity がシステムによって kill される状態をシミュレートする方法

http://tlync.hateblo.jp/entry/20111115/1321333623

WIN DEATHを再現する方法。



Android:アプリ起動時に必ず始めのActivityから開始する

http://cointreau-15ml.blogspot.jp/2011/09/androidactivity.html

android:cleartaskonlaunch="true"を書いておく




<<<グチ>>>

Windowsで言ったら

「子ウインドウ作ってしばらく放置したら子ウインドウから再起動したので親ウインドウがなくて死にました」



設計おかしくない?って思っちゃうよこんなん。すっげぇ時間無駄にした。

でもこれがAndroidなんだよね。もうこういうの慣れた。



タイトルの○○に何が入るかはご想像にお任せします




お役に立てたらよろしければコチラをぽちっと↓

ブログランキング・にほんブログ村へ
にほんブログ村
 

人気ブログランキング
押して頂けると嫁(*・ω・)のブログモチベーションが上がります(*´Д`*)