2011年5月31日火曜日

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);

}
}

0 件のコメント:

コメントを投稿