【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】任意のスレッドで処理を行う
非UIスレッドでUIを操作したい場合に、任意の処理をUIスレッド上で実行する。 目次
-
【android】バイブレーションを使う
必要なファイル MyApp.manifest MyApp.java MyApp.m
-
【android】webviewでアプリ内にwebページを読み込む
webviewを使ってandroidアプリ内にwebページを読み込む定型文です。 //vie
-
【android】ネットワークの接続状況を確認する
コードから接続状況を確認。 ConnectivityManager co
-
【android】リスト項目のmatch_parentが効かない
下記のようなリスト項目用のレイアウトを用意して、リストの右端にチェックボックスを置くようにしたのです
-
【android】ホーム画面や他のアプリの前面にViewを表示する。
WindowManagerのTYPE_SYSTEM_ALERTのレイヤーにViewを表示することで、
-
[android] モンキーテスト(Monkey Test)を実行する
最近テストの効率化に目覚めました。 モンキーテストは猿にアプリを渡してみてめちゃくちゃな操作をさせ
-
【android】処理時間を計測する
パフォーマンスのリファクタリングを行うには処理時間の計測がかかせません。 SDK標準のクラスを使っ
-
【android】IMEの表示/非表示
//IMEを閉じる InputMethodManager inputMethodManager