*

【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ですね。

以上

関連記事

no image

【android】サービスの実装

ダウンロードなどActivityに依存したくない大きなバックグラウンド処理や常駐プロセスを作りたい場

記事を読む

no image

ダイアログを表示する

カスタムアラートダイアログ private void showCustomAlert(A

記事を読む

no image

【android】言語・地域設定の取得

androidでは利用する言語と国名がjava.util.Localeのオブジェクトとして設定されて

記事を読む

no image

【android】リスト項目のmatch_parentが効かない

下記のようなリスト項目用のレイアウトを用意して、リストの右端にチェックボックスを置くようにしたのです

記事を読む

no image

[android] ActivityとFragmentのライフサイクルいろいろ

Fragmentを使い始めてライフサイクル関係でハマることがあったので備忘録。 FragmentA

記事を読む

no image

【android】ハードウェアキー入力を検出する

Activityを継承したクラスで下記を記述します。 public boolean

記事を読む

no image

【android】 APIバージョンによる動作の違い

「最近使用したアプリケーション」からの起動 2.x系 -> onNewIntentが呼ばれる 4

記事を読む

no image

【android】標準の設定画面を作る

設定画面のテンプレートです。 検索一発クンのコードから抜粋しました。 チェックボックス、リス

記事を読む

no image

【android】非同期処理

Androidで非同期処理、マルチスレッドを処理するスニペット。 AndroidのスレッドはUIス

記事を読む

no image

【android】処理時間を計測する

パフォーマンスのリファクタリングを行うには処理時間の計測がかかせません。 SDK標準のクラスを使っ

記事を読む

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

no image
知らないと損をする6つのライセンスまとめ

オープンソースやフリーウェア、フリー素材などが巷に溢れ、それらを利用す

no image
ガリレオ:ニュースブラウザをリリースしました。

概要 ガリレオはニュースを読んだり、検索する機能に特化したブラウザア

no image
【android】Activityとプロセスのライフサイクル

またもやライフサイクル周りでハマったのですが、Androidのライフサ

→もっと見る

PAGE TOP ↑