Applicationクラスを継承して、データの共有をする。
本日は、Applicationクラスを継承したクラスを作成し、データのApplication内共有を行います。
Applicationクラスは、Androidアプリケーションがプロセスとして起動する際に作成され、呼び出されます。
継承することで、独自実装を持つことが出来ます。
Override出来るMethodも用意されており、ライフサイクルも以下の様に存在します。
| onCreate | Applicationクラス作成時 |
| onTerminate | Applicationクラス終了時 |
| onLowMemory | 使用出来るメモリが少なくなった時 |
| onConfigurationChanged | 端末の状態が変わった時(オリエンテーションの変更など) |
Application内での共有データ等の管理などに便利です。
詳細な使用方法は続きをどうぞ
Applicationクラスを継承する際に必要な事は、
- 継承したクラスの作成
- AndroidManifest.xmlへの独自Applicationクラスの登録
以上の二点です。
また、使用する場合には以下に気をつけます。
- Context#getApplication() を使用し、独自Applicationクラスのオブジェクトを取得する。
今回は2枚のActivityを作成し、以下の様に動作するサンプルを作成します。
- 画像リソースの取得/独自Applicationクラスへのデータセット
- 独自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