【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】 Android4.1のserviceでdefaultPreferenceがおかしい
【現象】 ActivityでdefaultPreferencesで保存したデータがservice内
-
-
【android】ネットワークの接続状況を確認する
コードから接続状況を確認。 ConnectivityManager co
-
-
【android】サービスの実装
ダウンロードなどActivityに依存したくない大きなバックグラウンド処理や常駐プロセスを作りたい場
-
-
ダイアログを表示する
カスタムアラートダイアログ private void showCustomAlert(A
-
-
[android] JSONのパースにかかる時間
リストデータなんかを保存したいというのはよくある要件だと思います。 DBは面倒だしカラム毎に集計す
-
-
[android] ActivityとFragmentのライフサイクルいろいろ
Fragmentを使い始めてライフサイクル関係でハマることがあったので備忘録。 FragmentA
-
-
【android】リソースからいろいろ取得する
リソースで定義したいろいろをコード内で呼び出す方法です。 レイアウト //リソースからレ
-
-
【android】アプリ内課金を実装する
アプリ内課金のサンプルコードを解析します。 参考URL 公式API Android
-
-
【android】ハードウェアキー入力を検出する
Activityを継承したクラスで下記を記述します。 public boolean
-
-
【android】 webviewでassetsのリソースを使用する
webviewでassets内のリソースにアクセスするには file:///android_a