fc2ブログ
  • 館内放送 [ツイッター]

    キンコンカンコーン・・・うみゃーだよ。館内放送だみゃ。
    ・・・・・キンコンカンコーン・・・ブツ
  • 町内会からのお知らせ [相互RSS]

【技術部】[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

プロフィール

うみゃー・アパカ

Author:うみゃー・アパカ
UMYA.net公式ブログです。
ツイッター:umya_net


リンクフリーです!
アドレス:http://umyanet.blog.fc2.com/

公式ホームページ

ラインスタンプ配信中!

リンク



スマホアプリ配信中

黄金疾走

スポンサード

人気商品

Powered by amaprop.net