【android】Activityとプロセスのライフサイクル
公開日:
:
android
またもやライフサイクル周りでハマったのですが、Androidのライフサイクルは複雑で困ります。
GMailやLineなどの大手アプリでも久しぶりに起動するとたまに落ちたりしますが、この辺りが原因なんじゃないかと勝手に思っています。
Activityとプロセスの状態とライフサイクルイベント
5と6は微妙な呼び名ですが、ここだけのお話なので。
1.アプリ起動 アプリ終了後にランチャからアプリアイコンタップ
Activity : 生
プロセス : 生
2.レジューム サスペンド時にランチャからアプリアイコンタップ
Activity : 生
プロセス : 生
3.アプリ終了 アプリフォラグラウンド時にユーザーがバックキータップ
Activity : 死
プロセス : 生
4.サスペンド アプリフォラグラウンド時にユーザーがホームキータップ
Activity : 生
プロセス : 生
5.プロセス終了 タスクツールなどからユーザーがプロセスを終了
Activity : 死
プロセス : 死
6.プロセスキル サスペンド時にメモリ圧迫等でOSがプロセス終了
Activity : 生
プロセス : 死
7.画面回転 アプリフォラグラウンド時に画面を回転
Activity : 生
プロセス : 生
鬼門は6のプロセスキル
ActivityとFragmentのライフサイクルでは7の画面回転がよく問題になりますが、プロセスでは6のプロセスキルではまります。
1.アプリ終了してもプロセスは生きているのでstaticメンバの状態は保持される
2.プロセスキルされてもActivityの状態は保持されている
普通はプロセスの方が生存期間が長いのですが、プロセスキルされた場合だけ、Activityの方が長くなります。
つまり、onCreateのsavedInstanceStateがnullではなく、Activityが復活した扱いになります。
なのでif (savedInstanceState == null) で初期化するような処理が通らなくなります。
例えば、フラグメントやシングルトンの初期化をここでやったりしていたのですが、6のサイクルの場合シングルトンを利用する局面になって、さらに初期化されていないとまずい処理になって、ようやく落ちる感じになるかと。
結局は
ちなみに今回はまったのはenumに状態を持たしていたのが原因なので、そもそも設計がアレかもしれません。
staticやenumなどプロセス依存の要素に状態を保持する場合はActivityとの兼ね合いも考えないといけないのがJava on Androidですね。
以上
関連記事
-
【android】アプリ内課金を実装する
アプリ内課金のサンプルコードを解析します。 参考URL 公式API Android
-
【android】 webviewでassetsのリソースを使用する
webviewでassets内のリソースにアクセスするには file:///android_a
-
【android】設定画面の作成
res/xml/preferences.xml <?xml version=&quo
-
【android】リスト項目のmatch_parentが効かない
下記のようなリスト項目用のレイアウトを用意して、リストの右端にチェックボックスを置くようにしたのです
-
【android】言語・地域設定の取得
androidでは利用する言語と国名がjava.util.Localeのオブジェクトとして設定されて
-
ダイアログを表示する
カスタムアラートダイアログ private void showCustomAlert(A
-
[android] ActivityとFragmentのライフサイクルいろいろ
Fragmentを使い始めてライフサイクル関係でハマることがあったので備忘録。 FragmentA
-
【android】アプリのバージョン情報を取得する
int versionCode = -1; String versionName = &quo
-
アプリ間連携 Intentfiler
ブラウザの共有からURLを受け取る。 Manifest.xmlのURL受け取り先のactivity
-
【android】バイブレーションを使う
必要なファイル MyApp.manifest MyApp.java MyApp.m