【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】処理時間を計測する
パフォーマンスのリファクタリングを行うには処理時間の計測がかかせません。 SDK標準のクラスを使っ
-
-
【android】標準の設定画面を作る
設定画面のテンプレートです。 検索一発クンのコードから抜粋しました。 チェックボックス、リス
-
-
【android】アプリのバージョン情報を取得する
int versionCode = -1; String versionName = &quo
-
-
ダイアログを表示する
カスタムアラートダイアログ private void showCustomAlert(A
-
-
【android】言語・地域設定の取得
androidでは利用する言語と国名がjava.util.Localeのオブジェクトとして設定されて
-
-
【android】 Android4.1のserviceでdefaultPreferenceがおかしい
【現象】 ActivityでdefaultPreferencesで保存したデータがservice内
-
-
[android] モンキーテスト(Monkey Test)を実行する
最近テストの効率化に目覚めました。 モンキーテストは猿にアプリを渡してみてめちゃくちゃな操作をさせ
-
-
【android】DrawableとBitmap、リソースの相互変換
Resource → Bitmap Bitmap bm = BitmapFactory.dec
-
-
【android】リスト項目のmatch_parentが効かない
下記のようなリスト項目用のレイアウトを用意して、リストの右端にチェックボックスを置くようにしたのです
-
-
【android】非同期処理
Androidで非同期処理、マルチスレッドを処理するスニペット。 AndroidのスレッドはUIス