こんにちは!
androidのstatic変数についてちょっと悩んでることがありますので、
質問させて頂きます。
現在androidアプリを制作しているのですが、
static宣言の変数のみを扱っているクラスがあります。(アプリ本体で扱うフラグなど)
しかし、androidはメモリが足りなくなるとstaticな変数は、
アプリが起動している状態でも強制的に消去されます。
ただ、staticな変数はandroidでは良い感じではないみたいです。
そのため永続化させたい値はPreferenceで管理するか、
あるいはstaticそのものを扱わないという選択で、
実際どちらがいいのか悩んでいます。
アプリ制作の際、皆さんはどちらを選んでいますか?
もしくは、別な方法で問題を解決しているのでしょうか?
アドバイス等ございましたら、よろしくお願いします。
androidのstatic変数の扱いについて
- Dixq (管理人)
- 管理人
- 記事: 1661
- 登録日時: 13年前
- 住所: 北海道札幌市
- 連絡を取る:
Re: androidのstatic変数の扱いについて
static変数は使わないようにすべきだと思います。
また、シングルトンに変数を持たせることで実現できるようなことも多重起動を考えると行わないのが得策です。
もしstatic変数を使わないと実現できないようなことがあるとすればそれは設計から見直した方が良いかもしれません。
そうは言っても、シングルトンを使う機会はあります。
しかしそのたびに私は不具合を生じる引き金を作りました・・。
Preferenceを使う場合はActivityのライフサイクルに気を付けてください。
例えばonDestroyで状態を書き込み、onCreateで読み込むような仕組みはアウトです。
(それがonStopとonStartでも同様です)
何故ならActivityを閉じてすぐに開くとonDestroyより先にonCreateが来るからです。
また、多重起動を考えずに作ると不具合の種になりますから、常に多重起動とActivityのライフサイクルに気を付けて下さい。
変数はなるべくインスタンス化させて持つようにするべきで、
シングルトン、Preference、データベース、static変数などに頼りすぎないようにするのが大事です。
(Activityのインテントにデータを付加させて渡したりするのが得策でしょう)
> アプリ制作の際、皆さんはどちらを選んでいますか?
どうしても必要な場合のみシングルトン、Preference、データベースを使っていますが、少なくともstatic変数は使っていません。
また、シングルトンに変数を持たせることで実現できるようなことも多重起動を考えると行わないのが得策です。
もしstatic変数を使わないと実現できないようなことがあるとすればそれは設計から見直した方が良いかもしれません。
そうは言っても、シングルトンを使う機会はあります。
しかしそのたびに私は不具合を生じる引き金を作りました・・。
Preferenceを使う場合はActivityのライフサイクルに気を付けてください。
例えばonDestroyで状態を書き込み、onCreateで読み込むような仕組みはアウトです。
(それがonStopとonStartでも同様です)
何故ならActivityを閉じてすぐに開くとonDestroyより先にonCreateが来るからです。
また、多重起動を考えずに作ると不具合の種になりますから、常に多重起動とActivityのライフサイクルに気を付けて下さい。
変数はなるべくインスタンス化させて持つようにするべきで、
シングルトン、Preference、データベース、static変数などに頼りすぎないようにするのが大事です。
(Activityのインテントにデータを付加させて渡したりするのが得策でしょう)
> アプリ制作の際、皆さんはどちらを選んでいますか?
どうしても必要な場合のみシングルトン、Preference、データベースを使っていますが、少なくともstatic変数は使っていません。
Re: androidのstatic変数の扱いについて
static変数がアプリ起動中に消えるというのは、Activityのメンバなのではないですか?
Androidは、画面の向きが変わったときなど、メインActivityであっても頻繁に新しいインスタンスに入れ替わります。
データ引き継ぎのためにメインActivityの新旧インスタンスが同時に存在する瞬間もあります。
ライフサイクルはActivity個々に対応するものですから、メインルーチンはひとつしかないものだと思い込んでいると面食らうと思います。
単独のクラスに持たせたstatic変数は、プロセスが破棄されるまで保持されるはずです。
そうでないとシングルトンを実装できないので。
ただし、プロセスが破棄されるタイミングは、Activityのライフサイクルとまったく関係ありません。
Androidはプロセスを再利用するので、static変数の値が残っているかどうかでアプリとして起動が新規か継続かを決めることはできません。
ですからアプリのライフサイクルは永続データを利用してアプリ自身で管理する必要があります。
PC用のプログラムで例えるなら、いつリセットボタンが押されても概ね平気なように作るようなものです。
Androidは、画面の向きが変わったときなど、メインActivityであっても頻繁に新しいインスタンスに入れ替わります。
データ引き継ぎのためにメインActivityの新旧インスタンスが同時に存在する瞬間もあります。
ライフサイクルはActivity個々に対応するものですから、メインルーチンはひとつしかないものだと思い込んでいると面食らうと思います。
単独のクラスに持たせたstatic変数は、プロセスが破棄されるまで保持されるはずです。
そうでないとシングルトンを実装できないので。
ただし、プロセスが破棄されるタイミングは、Activityのライフサイクルとまったく関係ありません。
Androidはプロセスを再利用するので、static変数の値が残っているかどうかでアプリとして起動が新規か継続かを決めることはできません。
ですからアプリのライフサイクルは永続データを利用してアプリ自身で管理する必要があります。
PC用のプログラムで例えるなら、いつリセットボタンが押されても概ね平気なように作るようなものです。
Re: androidのstatic変数の扱いについて
ありがとうございます!Dixq (管理人) さんが書きました:static変数は使わないようにすべきだと思います。
また、シングルトンに変数を持たせることで実現できるようなことも多重起動を考えると行わないのが得策です。
もしstatic変数を使わないと実現できないようなことがあるとすればそれは設計から見直した方が良いかもしれません。
そうは言っても、シングルトンを使う機会はあります。
Preferenceを使う場合はActivityのライフサイクルに気を付けてください。
例えばonDestroyで状態を書き込み、onCreateで読み込むような仕組みはアウトです。
(それがonStopとonStartでも同様です)
何故ならActivityを閉じてすぐに開くとonDestroyより先にonCreateが来るからです。
また、多重起動を考えずに作ると不具合の種になりますから、常に多重起動とActivityのライフサイクルに気を付けて下さい。
変数はなるべくインスタンス化させて持つようにするべきで、
シングルトン、Preference、データベース、static変数などに頼りすぎないようにするのが大事です。
(Activityのインテントにデータを付加させて渡したりするのが得策でしょう)
どうしても必要な場合のみシングルトン、Preference、データベースを使っていますが、少なくともstatic変数は使っていません。
現状はただゲーム内のフラグ管理をしたいだけだったので、
全部インスタンス化して扱うことにします。
セーブデータなどの際にファイルか何かに保存すればそれは大丈夫だと思います。
インテントの扱いはまだ何もわかってないので、勉強していきますね。
とにかくstatic変数をandroidで扱うのはやめます(^^;)
Re: androidのstatic変数の扱いについて
ありがとうございます!ISLe さんが書きました:static変数がアプリ起動中に消えるというのは、Activityのメンバなのではないですか?
Androidは、画面の向きが変わったときなど、メインActivityであっても頻繁に新しいインスタンスに入れ替わります。
データ引き継ぎのためにメインActivityの新旧インスタンスが同時に存在する瞬間もあります。
ライフサイクルはActivity個々に対応するものですから、メインルーチンはひとつしかないものだと思い込んでいると面食らうと思います。
単独のクラスに持たせたstatic変数は、プロセスが破棄されるまで保持されるはずです。
そうでないとシングルトンを実装できないので。
ただし、プロセスが破棄されるタイミングは、Activityのライフサイクルとまったく関係ありません。
Androidはプロセスを再利用するので、static変数の値が残っているかどうかでアプリとして起動が新規か継続かを決めることはできません。
ですからアプリのライフサイクルは永続データを利用してアプリ自身で管理する必要があります。
PC用のプログラムで例えるなら、いつリセットボタンが押されても概ね平気なように作るようなものです。
一応マニフェストファイルで、横画面専用にしているため
たぶん向きがコロコロ変わることはないと思います。
話としてプロセスがアプリ起動中に破棄されてしまう可能性があると聞いたので、
実際どうしようか考えてあぐねていました。
やっぱりアプリ自体のデータはアプリでちゃんと全て管理したほうが良さそうですね。
Re: androidのstatic変数の扱いについて
『など』と書きましたように、画面の向きが変わるときというのは一例に過ぎません。海Sea さんが書きました:一応マニフェストファイルで、横画面専用にしているため
たぶん向きがコロコロ変わることはないと思います。
スマホに電話が掛かってきたとき(あるいは通話中)にプロセスが破棄される可能性もゼロではありません。
一アプリが電話の着信を禁止できるでしょうか。
もしかしてアプリ起動中にプロセスが破棄される可能性というのは↑のようなことですかね。
ライフサイクルを無視して破棄されるわけではないですが。
スマホはあくまで電話なので、アプリはスキマ時間に動いているという意識が必要だと思います。
その辺はこのサイトのゲームプログラミングの館に書いてある内容をきちんと理解して実践できるようであれば問題にならないはずです。
同じ作り方でAndroidに限らずいろんな環境に対応できますし。