android の static 変数 が気持ち悪い

Android_Application_Framework_FAQ___Android_Developers

整理してメモ。

2つの状況。

その1:

static 変数がプロセスに保持されている。

プロセスが生きたままだとと思っていたら死んでいる。

そのアプリを画面に表示したときにプロセス再起動。

static 変数が初期化される。

その2:

static 変数がプロセスに保持されている。

プロセスが死んでいると思ったら生きている。

そのアプリを画面に表示したときに既存プロセス利用。

static 変数は初期化されず、そのまま利用される。

結局、アプリの画面を表示したときにそれが

「再起動されたプロセス(static変数初期化)」なのか
「再利用されたプロセス(保持されたstatic変数)」なのか

をはっきり認識しづらいのが問題。

めんどくさいので雑にいうと

その表示した画面が

「アプリ全体を新しく起動した画面」なのか
「一部しれっと生きてた情報を再利用した画面」なのか

と思ったほうが簡単で直感的なのか。

細かくいうといろいろあるのだろうけども。

極端に、

「アプリプロセスはいつでも死ぬ可能性がある」

ということにしておいて、消えて困る情報はアプリプロセス以外の
場所に保持しておくとよし、と。

Preference・データベース・ファイル…

(singleton がどうのこうのはアプリプロセスあっての)

なんで「static変数」がよく問題になるのかは、AndroidなJava 以外のように

「異なるライフサイクルを持つクラス間で、アプリ内で見通しよく簡単に情報を持ち回りたい」

から。

これには「Applicationクラス」を使う、と。

Applicationクラスを継承して、データの共有をする。 « Tech Booster

AndroidアプリでContextを持ち回したい話 - FLYING

MyAppのstatic変数を使うことで、アクティビティのライフサイクルに影響を受けずに値を保持し続けることができます。
またstaticメソッドを用意することで、アプリ内のどこからでもアクセスすることができます。

各オブジェクトの状態をアプリから監視させたり。

Android - Applicationクラスを使ってObserverパターンを実装する - Qiita

念のためそこら公式ドキュメントをみる。

一つのアプリのすべてのActivityやServiceはデフォルトで一つのプロセスで実行される。もし必要であれば、AndroidManifest.xml の android:process 属性を設定することで、別プロセスで実行することができる。

基本
ActivityやService間でデータを共有する場合は「Intent.putExtras()」などを使う。

非永続的
・public static フィールド/メソッド
・Singleton クラス
・WeakReferences な HashMap

永続的
・Preference
・ファイル
・ContentProvider
・SQLite DB

Android Application Framework FAQ | Android Developers

極端にして頭にまず刻んでおく。

・変化する static変数 は共有に使わない。(必ず初期化する)
・アプリプロセスはいつでも死ぬ可能性がある。
・アプリプロセスは死んでるようで生きている。
・アプリ内の消えて困るデータは意識して保存。
・持ち回りはApplicationクラスでもいける。

公式なドキュメントは一度きちんと目を通しておくべき、といいたくなるが、毎度のことすぎて。

今後も都度読みでおねがいします。


関連ワード:  Android評判開発