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クラスを作成します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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属性に

1
android:name="ClassPath"

を追記します。

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

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

Activityからの利用方法

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

1
Context.getApplicationContext()

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
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を用いて表示しています。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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