連載
» 2009年01月19日 00時00分 公開

Androidで動く携帯Javaアプリ作成入門(2):Androidアプリ作成の基本“Activity”とは何か? (2/2)

[緒方聡,株式会社イーフロー]
前のページへ 1|2       

ライフサイクルの動作を確認してみよう

 以下のアプリをダウンロードしてEclipseにインポートしてください。

2011年9月23日追記「Androidのバージョン違いによるサンプルの動作について補足」

 サンプルコードをEclipseにインポートすると、以下のようなコンパイルエラーが発生することがあります。

補足図1 コンパイルエラー 補足図1 コンパイルエラー

 このエラーは、過去のAndroid Development Toolkitと最新のそれでは、仕様が異なることに由来しています。

 2011年9月23日時点の最新の環境(Eclipse:3.7.0、ADT:12.0.0)での対応方法を以下に示します。

【1】プロジェクトに新規ファイルを作成

補足図2 新規ファイルを作成 補足図2 新規ファイルを作成

 ファイル名は「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を保存すると、プロジェクト内が以下のような状態になります。

補足図3 「default.properties」を追加後 補足図3 「default.properties」を追加後

【2】「R.java」を削除

 古いADTではR.javaは開発者のソースコードと同じフォルダに生成されていましたが、新しいADTでは、「gen」という別のフォルダに作成されるようになりました。

 自動生成されたgenフォルダのソースコードが、元からあるR.javaと衝突してコンパイルエラーになっています。元からあるR.javaは削除してください。

補足図4 R.javaを削除後 補足図4 R.javaを削除後

 このアプリは、Activityのイベント通知を受けるメソッドで、以下のようにToastクラスを用いて簡単なメッセージを表示しています。

    @Override
    protected void onPause () {
        super.onPause ();
        Toast.makeText(this, "onPause()", Toast.LENGTH_SHORT).show();
    }

 Androidシミュレータで実行してToast.show()メソッドが呼び出されると、画面に小さなメッセージが表示されます。

図4 Toast.show()が呼び出されたところ 図4 Toast.show()が呼び出されたところ

 Toastは、呼び出し元のActivityが表示されていなくても表示されるので、ユーザーへの通知やデバッグなどに何かと便利です。

 さて、アプリを実行すると、状態は「開始」から「実行中」まで遷移し、onCreate()、onStart()、onResume()のToastが順番に表示されることが確認できたと思います。

図5 起動直後の状態遷移 図5 起動直後の状態遷移

 では、実行中の状態で下記の「通話」マークのボタンを押してみてください。

「通話」マークのボタン

 このボタンを押すと、電話発信を行うPhone Activityが起動して、元から起動していたActivityが停止状態になりonPause()、onStop()が確認できたと思います。

図6 ほかのActivityを実行した際の状態遷移 図6 ほかのActivityを実行した際の状態遷移

 onStop()が呼び出された後、Activityは停止状態になります。この停止状態では、ほかのアプリの影響を受けていつでも終了したりメモリが解放されたりする可能性があるので、それらを考慮してプログラミングしなければなりません。

 さて、今度はPhone Activityで下記の「戻る」マークのボタンを押してみてください。

「戻る」マークのボタン

 元のActivityに戻って、onRestart()、onStart()、onResume()が確認できたと思います。

図7 Activityを再開した際の状態遷移 図7 Activityを再開した際の状態遷移

 onStop()からの遷移は、今回は右側の経路を通りましたが、左側の「強制終了」を経由することもあります。どちらを経由するかは、停止中のアプリのメモリ使用量と、そのほか動作しているアプリのメモリ使用量によって変わってきます。

 左右どちらの経路をたどったにしても、アプリは再び実行中になりました。ここでまた、先ほどの「戻る」マークのボタンを押してみてください。onPause()やonStop()が確認できたと思います。場合によってはonDestroy()も表示されたかもしれません。

図8 終了させた場合の状態遷移(onDestroy()が呼ばれたケース) 図8 終了させた場合の状態遷移(onDestroy()が呼ばれたケース)

 Androidはアプリを起動してActivityが呼び出され、そのActivityから別のActivityが呼び出されると、Activityがヒストリースタック(履歴)に積まれていきます。先ほどの「戻る」マークのボタンでヒストリースタックをさかのぼり、ホームスクリーンまで戻るとヒストリースタックは空になります。

Activityを上手にコントロールするには?

 Activityの状態が変更されたタイミングでイベントを受け取るコールバックメソッドは、前述の状態遷移図で紹介しましたが、それら以外にもライフサイクルをコントロールするためのメソッドが用意されているので、一部を取り上げて紹介します。

メソッド 概要
public void finish() Activityを終了させる
public boolean isFinishing() finish()メソッドで終了中かどうかを判定する
public void onLowMemory() システム全体で空きメモリが少なくなったら呼び出される
表 ライフサイクルをコントロールするために使用したいメソッド

finish()メソッド

 finish()メソッドは、Activityを終了させるのに使用します。冒頭で説明したとおり、ActivityはAndroidアプリの画面に当たります。1つのアプリで複数の画面を持つ場合、A画面からB画面を呼び出して、B画面からA画面に戻る際にB画面のfinish()を呼び出すということもよくあります。

isFinishing()メソッド

 isFinishing()は、finish()によって状態遷移しているのかそうでないのかを判定します。onPause()でisFinishing()を使用し、必要に応じてアプリの状態を保持するのがよく見られる使い方です。

onLowMemory()メソッド

 onLowMemory()はシステムの空きメモリが足りなくなった場合に呼び出されます。このメソッドが呼び出されたら、必要なオブジェクト以外は“破棄”するようにしましょう。このメソッドが呼び出された後に、ガベージコレクションが実行されます。

ActivityはAndroidアプリの基本の“き”

 今回はActivityのライフサイクルについて習得しましたがいかがでしたでしょうか。これで、Activityの“半分”をマスターした形です。

 次回は画面(Activity)を複数持つアプリを作成し、画面間(Activity間)を行き来しながら情報を受け渡しする、UIイベントも駆使した、だけどシンプルで簡単なアプリを実際に動かしながらActivityの残り半分をマスターしていきましょう。


「Androidで動く携帯Javaアプリ作成入門」バックナンバー
前のページへ 1|2       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。