【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】サービスの実装
ダウンロードなどActivityに依存したくない大きなバックグラウンド処理や常駐プロセスを作りたい場
-
-
【android】処理時間を計測する
パフォーマンスのリファクタリングを行うには処理時間の計測がかかせません。 SDK標準のクラスを使っ
-
-
【android】 adbコマンド集
●adbサービス起動 adb start-server ●adbサービス終了 adb
-
-
【android】 Android4.1のserviceでdefaultPreferenceがおかしい
【現象】 ActivityでdefaultPreferencesで保存したデータがservice内
-
-
ダイアログを表示する
カスタムアラートダイアログ private void showCustomAlert(A
-
-
【android】stringsリソースにパラメータを埋め込む
●strings.xml %n$x n : 引数に渡す際の順番。n番目の引数。 x
-
-
【android】DrawableとBitmap、リソースの相互変換
Resource → Bitmap Bitmap bm = BitmapFactory.dec
-
-
【android】ホーム画面や他のアプリの前面にViewを表示する。
WindowManagerのTYPE_SYSTEM_ALERTのレイヤーにViewを表示することで、
-
-
アプリ間連携 Intentfiler
ブラウザの共有からURLを受け取る。 Manifest.xmlのURL受け取り先のactivity
-
-
【android】リソースからいろいろ取得する
リソースで定義したいろいろをコード内で呼び出す方法です。 レイアウト //リソースからレ