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


本日は、Applicationクラスを継承したクラスを作成し、データのApplication内共有を行います。

Applicationクラスは、Androidアプリケーションがプロセスとして起動する際に作成され、呼び出されます。

継承することで、独自実装を持つことが出来ます。

Override出来るMethodも用意されており、ライフサイクルも以下の様に存在します。

onCreate Applicationクラス作成時
onTerminate Applicationクラス終了時
onLowMemory 使用出来るメモリが少なくなった時
onConfigurationChanged 端末の状態が変わった時(オリエンテーションの変更など)

Application内での共有データ等の管理などに便利です。

詳細な使用方法は続きをどうぞ

Applicationクラスを継承する際に必要な事は、

  • 継承したクラスの作成
  • AndroidManifest.xmlへの独自Applicationクラスの登録

以上の二点です。

また、使用する場合には以下に気をつけます。

  • Context#getApplication() を使用し、独自Applicationクラスのオブジェクトを取得する。

今回は2枚のActivityを作成し、以下の様に動作するサンプルを作成します。

  1. 画像リソースの取得/独自Applicationクラスへのデータセット
  2. 独自Applicationクラスからのデータロード/画像リソースの表示

Applicationクラスの継承

まず、Applicationクラスを継承した、独自Applicationクラスを作成します。

package com.techbooster.applicationclasstest;

import android.app.Application;
import android.graphics.Bitmap;
import android.util.Log;

public class TestApplication extends Application {
	private final String TAG = "DEBUG-APPLICATION";
	private Bitmap obj;

	@Override
    public void onCreate() {
	    /** Called when the Application-class is first created. */
		Log.v(TAG,"--- onCreate() in ---");
	}

    @Override
    public void onTerminate() {
    	/** This Method Called when this Application finished. */
		Log.v(TAG,"--- onTerminate() in ---");
    }

    public void setObj(Bitmap bmp){
    	obj = bmp;
    }

    public Bitmap getObj(){
    	return obj;
    }
}

AndroidManifest.xmlへの追記

Manifest.xmlのApplication属性に


android:name="ClassPath"

を追記します。

今回は、以下のように記述しています。

	<!-- application属性に「android:name」属性を追加 -->
	<application android:name="com.techbooster.applicationclasstest.TestApplication"
		android:icon="@drawable/icon" android:label="@string/app_name">

Activityからの利用方法

上記の通り、Activityから独自Applicationのオブジェクトを取得する為には、

 Context.getApplicationContext()

を利用する必要があります。
以下に1つ目のActivityのソースコードを記述します。

JpegリソースからBitmapオブジェクトを作成し、独自Applicationオブジェクトにセットしています。

package com.techbooster.applicationclasstest;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class Main extends Activity implements OnClickListener {
	private Bitmap bmp_main;
	private TestApplication ta;
	private Button bt;

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		/* getApplication()で自己アプリケーションクラスのインスタンスを拾う */
		ta = (TestApplication) this.getApplication();

		bt = (Button) findViewById(R.id.Button01);
		bt.setOnClickListener(this);

	}

	@Override
	public void onClick(View v) {
		if (v == bt) {
			bmp_main = BitmapFactory.decodeResource(getResources(),
					R.drawable.andy);

			ta.setObj(bmp_main);

			Intent i = new Intent();
			i.setClassName("com.kobashin.applicationclasstest",
					"com.kobashin.applicationclasstest.Sub");
			startActivity(i);
		}
	}

}

2つ目のActivityのソースコードは以下の通りです。

独自Applicationオブジェクトから、セットしたBitmapオブジェクトを取得し、

ImageViewを用いて表示しています。

package com.techbooster.applicationclasstest;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.widget.ImageView;
import android.widget.LinearLayout;

public class Sub extends Activity {

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
    	super.onCreate(savedInstanceState);
        setContentView(R.layout.sub);

        TextView tView = new TextView(this);

        /* getApplication()で自己アプリケーションクラスのインスタンスを拾う */
        TestApplication ta = (TestApplication)this.getApplication();

        Bitmap bmp_sub = ta.getObj();

        LinearLayout lLayout = (LinearLayout)findViewById(R.id.LinearLayout01);
        ImageView iView = (ImageView)findViewById(R.id.ImageView01);

        iView.setImageBitmap(bmp_sub);

    }
}
One Comment