アクティビティのライフサイクルとonCreateメソッド
アプリケーションが開始されると最初に表示されるアクティビティのオブジェクトが自動的に作成されます。またプログラムの中で他のアクティビティのオブジェクトを作成して別の画面を表示することもできます。
アクティビティは作成から破棄されるまで色々な「状態」となります。初めて作成された時、初めて表示されようとしている時、最前面で表示されてユーザーからの入力を待っている時、一時的に隠れている時、など「状態」が変化していきます。そしてその状態が変わる時に、Activityクラスで定義された様々なメソッドが呼び出されます。下記にアクティビティの状態の変化に合わせてどのようなメソッドが呼び出されるのかを簡単に記述しました(一部です)。
Activity starts
v
onCreate()
v
onStart()
v
onResume()
v
Activity running
v
onPause()
v
onStop()
v
onDestroy()
v
Activity is shut down
アクティビティのオブジェクトが作成されるとまず「onCreate」メソッドが呼び出されます。ここで初期化などの処理が行います。
続いて「onStart」メソッド、「onResume」メソッドなどが呼び出され画面として表示されるようになります。この段階でアクティビティはユーザーからの入力などが受け付けられる状態となります。
表示されていたアクティビティが破棄される場合などは「onPause」>「onStop」>「onDestroy」と状態の変換に伴ってメソッドが呼び出されていきます。またこの図では省略していますが、他のアクティビティが表示されることによってアクティビティが一時的に隠れていた場合などは「onStop」を実行した後で「onRestat」メソッドが呼び出された後で「onStart」メソッドの状態に戻ったりもします。
アクティビティの状態に対応する各メソッドをオーバーライドすることで、アクティビティがその状態になった時にどのようなことを行わせるのかを記述することができます。
onCreateメソッド
アクティビティが最初に作成された時などに呼び出されるメソッドが「onCreate」メソッドです。このメソッドが実際に表示が行われる前の初期化処理などを記述します。ボタンなどの部品を配置する場合、このメソッドをオーバーライドして記述していきます。
「onCreate」メソッドは次のように定義されています。
onCreate protected void onCreate(Bundle savedInstanceState)
Called when the activity is starting. This is where most initialization should go:
calling setContentView(int) to inflate the activity's UI, using findViewById(int)
to programmatically interact with widgets in the UI, calling
managedQuery(android.net.Uri, String[], String, String[], String) to retrieve
cursors for data being displayed, etc.
You can call finish() from within this function, in which case onDestroy() will be
immediately called without any of the rest of the activity lifecycle (onStart(),
onResume(), onPause(), etc) executing.
Derived classes must call through to the super class's implementation of this method.
If they do not, an exception will be thrown.
Parameters:
savedInstanceState If the activity is being re-initialized after previously being
shut down then this Bundle contains the data it most recently supplied in
onSaveInstanceState(Bundle). Note: Otherwise it is null.
メソッドが呼び出されるとBundleクラスのオブジェクトが渡されてきます。このオブジェクトには保存しておいた情報などが含まれているのですが、取り合えず気にしないで下さい。
「onCreate」メソッドをオーバーライドする場合には、必ずスーパークラスのメソッドを呼び出す必要があります。
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
/* ... */
}
また自動生成されたコードにはアノテーションの「@Override」を記述しているようなので自分でコードを記述する場合も同じように記述します。
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
/* ... */
}
あとは必要な独自の処理を追加していきます。例えばTextViewクラスのオブジェクトを配置する場合には次のように記述します。
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
TextView tv = new TextView(this);
tv.setText("Hello Android");
setContentView(tv);
}
これでこのアクティビティが作成された時に「onCreate」メソッドが呼び出されて画面上にテキストビューが表示されます。
サンプルプログラム
では実際に試してみます。
では実際に試してみます。前のページで作成したプロジェクトの中で「src」>「jp.javadrive.sample」>「SampleActivity.java」をダブルクリックして下さい。Eclipseのソースエディタが起動してソースファイルの中身が表示されます。
package jp.javadrive.sample;
import android.app.Activity;
import android.os.Bundle;
public class SampleActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}
ソースコードを次のように書き換えます。
package jp.javadrive.sample; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; public class SampleActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); TextView tv = new TextView(this); tv.setText("こんにちは"); setContentView(tv); } }
アプリケーションの実行を行います。次のように表示されます。
今回はアクティビティのクラスの中で最初に呼び出されるonCreateメソッドをオーバーライドし、アクティビティの中にTextViewを配置してみました。
( Written by T.buzz.Ikura+ )