以下のアプリをダウンロードしてEclipseにインポートしてください。
サンプルコードをEclipseにインポートすると、以下のようなコンパイルエラーが発生することがあります。
このエラーは、過去のAndroid Development Toolkitと最新のそれでは、仕様が異なることに由来しています。
2011年9月23日時点の最新の環境(Eclipse:3.7.0、ADT:12.0.0)での対応方法を以下に示します。
ファイル名は「default.properties」とします。
これは、新しいADT自動生成されるファイルで、AndroidのAPI Levelを指定する役割があります。このファイルに、以下のように1行追加します。
target=android-10
「android-10」の部分は、対象のAndroidのバージョンに合わせて変更してください。
Androidバージョン | ターゲット表記 |
---|---|
Android 1.5 | android-3 |
Android 1.6 | android-4 |
Android 2.1-update1 | android-7 |
Android 2.2 | android-8 |
Android 2.3.1 | android-9 |
Android 2.3.3 | android-10 |
Android 3.0 | android-11 |
Android 3.1 | android-12 |
Android 3.2 | android-13 |
表 Androidバージョンとターゲット表記 |
default.propertiesを保存すると、プロジェクト内が以下のような状態になります。
古いADTではR.javaは開発者のソースコードと同じフォルダに生成されていましたが、新しいADTでは、「gen」という別のフォルダに作成されるようになりました。
自動生成されたgenフォルダのソースコードが、元からあるR.javaと衝突してコンパイルエラーになっています。元からあるR.javaは削除してください。
このアプリは、Activityのイベント通知を受けるメソッドで、以下のようにToastクラスを用いて簡単なメッセージを表示しています。
@Override protected void onPause () { super.onPause (); Toast.makeText(this, "onPause()", Toast.LENGTH_SHORT).show(); }
Androidシミュレータで実行してToast.show()メソッドが呼び出されると、画面に小さなメッセージが表示されます。
Toastは、呼び出し元のActivityが表示されていなくても表示されるので、ユーザーへの通知やデバッグなどに何かと便利です。
さて、アプリを実行すると、状態は「開始」から「実行中」まで遷移し、onCreate()、onStart()、onResume()のToastが順番に表示されることが確認できたと思います。
では、実行中の状態で下記の「通話」マークのボタンを押してみてください。
このボタンを押すと、電話発信を行うPhone Activityが起動して、元から起動していたActivityが停止状態になりonPause()、onStop()が確認できたと思います。
onStop()が呼び出された後、Activityは停止状態になります。この停止状態では、ほかのアプリの影響を受けていつでも終了したりメモリが解放されたりする可能性があるので、それらを考慮してプログラミングしなければなりません。
さて、今度はPhone Activityで下記の「戻る」マークのボタンを押してみてください。
元のActivityに戻って、onRestart()、onStart()、onResume()が確認できたと思います。
onStop()からの遷移は、今回は右側の経路を通りましたが、左側の「強制終了」を経由することもあります。どちらを経由するかは、停止中のアプリのメモリ使用量と、そのほか動作しているアプリのメモリ使用量によって変わってきます。
左右どちらの経路をたどったにしても、アプリは再び実行中になりました。ここでまた、先ほどの「戻る」マークのボタンを押してみてください。onPause()やonStop()が確認できたと思います。場合によってはonDestroy()も表示されたかもしれません。
Androidはアプリを起動してActivityが呼び出され、そのActivityから別のActivityが呼び出されると、Activityがヒストリースタック(履歴)に積まれていきます。先ほどの「戻る」マークのボタンでヒストリースタックをさかのぼり、ホームスクリーンまで戻るとヒストリースタックは空になります。
Activityの状態が変更されたタイミングでイベントを受け取るコールバックメソッドは、前述の状態遷移図で紹介しましたが、それら以外にもライフサイクルをコントロールするためのメソッドが用意されているので、一部を取り上げて紹介します。
メソッド | 概要 |
---|---|
public void finish() | Activityを終了させる |
public boolean isFinishing() | finish()メソッドで終了中かどうかを判定する |
public void onLowMemory() | システム全体で空きメモリが少なくなったら呼び出される |
表 ライフサイクルをコントロールするために使用したいメソッド |
finish()メソッドは、Activityを終了させるのに使用します。冒頭で説明したとおり、ActivityはAndroidアプリの画面に当たります。1つのアプリで複数の画面を持つ場合、A画面からB画面を呼び出して、B画面からA画面に戻る際にB画面のfinish()を呼び出すということもよくあります。
isFinishing()は、finish()によって状態遷移しているのかそうでないのかを判定します。onPause()でisFinishing()を使用し、必要に応じてアプリの状態を保持するのがよく見られる使い方です。
onLowMemory()はシステムの空きメモリが足りなくなった場合に呼び出されます。このメソッドが呼び出されたら、必要なオブジェクト以外は“破棄”するようにしましょう。このメソッドが呼び出された後に、ガベージコレクションが実行されます。
今回はActivityのライフサイクルについて習得しましたがいかがでしたでしょうか。これで、Activityの“半分”をマスターした形です。
次回は画面(Activity)を複数持つアプリを作成し、画面間(Activity間)を行き来しながら情報を受け渡しする、UIイベントも駆使した、だけどシンプルで簡単なアプリを実際に動かしながらActivityの残り半分をマスターしていきましょう。
Copyright © ITmedia, Inc. All Rights Reserved.