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

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

続きを読む >>