本日は、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クラスを作成します。
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); } }