
【技術部】[Android開発] 変数の値が消えた!?static変数の罠

※カテゴリー【技術部】は技術者向けの記事となります。
![]() |
アプリ内で使いまわす変数、staticで持つと危険です。 |
【目的】
Androidアプリ内で使いまわす変数を用意する
Static変数は危険!
共有変数として便利なstatic変数ですが、アプリがバックグラウンドにある状態でメモリを消費すると
static変数は問答無用で消されてしまいます。
メモリが少ないAndroidならではの仕様ですね。
共有変数はApplicationクラスへ!!
Androidアプリは画面毎にActivityクラスを使用しますが、実はアプリ起動時にApplicationクラス
というものを1つ生成しています。
共有変数はこのApplicationクラスを継承した独自クラスを定義し、そこに宣言します。
サンプルソース
AppBase.java
Applicationクラスを継承したクラス。
ここにアプリ内で使いまわす変数(サンプルではstrData)を定義します。
package com.UMYA.matome_showtime; import android.app.Application; public class AppBase extends Application { @Override public void onCreate() { strData = "初期値"; } private String strData; public ListMode getData() { return strData; } public void setData(String value) { strData = value; } }AndroidManifest.xml (抜粋) 先ほど作成したクラス(AppBase)を使用するようAndroidManifest.xmlに設定します。 applicationタブの「android:name」にクラスパスを設定。
MainActivity.java AppBaseクラスから変数を取得します。 前準備として、this.getApplication()でAppBaseクラスを取得しますが、戻り値がApplication型なので AppBase型にキャストします。 その後、AppBaseクラスにアクセスして変数値を取得します。
package com.UMYA.matome_showtime; import android.support.v7.app.ActionBarActivity; public class MainActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { // AppBaseをgetApplication()で取得する。 appbase = (AppBase) this.getApplication(); // AppBaseから変数を取得する。 String strData; strData = appbase.getData(); } }
まとめ
■ static変数はAndroidが勝手に消してしまう場合がある。
■ アプリ内で使いまわす変数はApplicationクラスを継承したクラスに定義する。
ご質問、ご意見等ありましたら下記コメントにご投稿お願いいたします。
- 関連記事
- この記事へのリアクション
コメントの投稿
タグ:技術部開発androidjavastaticapplicationactivity