世界を目指せ!Androidアプリ開発入門

第4回 Androidの肝,アクティビティ

この記事を読むのに必要な時間:およそ 2 分

前回のおさらい

前回は,サンプルプログラム「SkeletonApp」をビルドして,エミュレーターと実機で動作確認を行い,エミュレータと実機では操作感が違うことをご説明しました。

今回は,Androidの肝でもあるアクティビティを取り上げます。

アクティビティとは?

アクティビティは,Androidの画面に相当し,ユーザが操作する画面と操作に対する処理を行います。画面を持つ物はアプリは,必ずアクティビティを持ちます。

これを「Windowsで例えると○×です」と言えれば,話しが早いのですが,Windowsには似たオブジェクトが存在しません。たとえば,同じ画面に相当するウィンドウと比較すると,以下の違いがあります。

  • 状況に応じて分岐する遷移状態を持つ
  • インスタンスの保存・復帰する仕組みを持つ
  • Android OSのタイミングで,強制終了・再起動される

少々難解な存在ですが,Androidのアプリ開発では,アクティビティに対する理解が肝になるので,動きや役割をこれからご紹介するサンプルプログラムを使ってしっかりと理解して下さい。

アクティビティとの付き合い方

まずは,以下の状態遷移図を参照して下さい。

どんな処理でも,開始があって終了まで状態遷移するワケなんですが,アクティビティでの状態遷移は少し複雑です。

図1 状態遷移図

図1 状態遷移図

開始から終了まで分岐なしに遷移すれば,面倒な話しはありませんが,ハードリソースを上手く使うために採用された仕組みが,遷移を複雑にしています。

たとえば,アクティビティがonPause, onStopの状態で,他のアプリが大量にメモリを要求すると,Android OSがアクティビティが強制終了します(再呼び出しされると,onCreateからの実行になります)。

また,アクティビティがonStopの状態になったらリソースを解放し,アクティビティが前面に移動しonRestartが呼ばれたら,リソース再確保を行うなど,行儀の良いアプリを開発することもできます。

こうした仕組みは,Windowsアプリを開発する感覚だと,難しいと感じるかもしれませんが,アクティビティに対する理解は,今後の開発の基礎となる部分なので,自身で試行錯誤するなどもして,必ず理解して見つけるようにしてください。

サンプルアプルを修正する

では,アクティビティの遷移を確認するために,前回ビルドしたアプリに手を加えていきます。

アクティビティの動きを確認するために,Dalvik Debug Monitor(以下,ddmsとします)を使います。ddmsは,SDKフォルダ以下のToolsフォルダに収録されているので,ダブルクリックで起動します(Windowsは,ddms.batです)。

図2 ddmsを起動した様子。3ペインに分割された内,画面下のLogタブにデバッグメッセージが出力される。

図2 ddmsを起動した様子。3ペインに分割された内,画面下のLogタブにデバッグメッセージが出力される。

ddmsは,名前の通りアプリのデバッグに活用できます。

ソースコードに,以下のコードを追加すると,ddmsのログウィンドウにデバッグメッセージを表示します。

Log.d( "SkeletonActivity", "onPause" );

デバッグメッセージの表示以外にも,Android OSが出力するエラーメッセージが表示されます。開発中のアプリが異常終了したときもメッセージが残るので,問題解決の手がかりを掴むヒントにもなります。このように,ddmsは,アプリ開発には必須ツールなので,この機会に使い方を覚えてください。

それでは,onPause, onResumeの動きを確認します。

Eclipseを起動して,パッケージエクスプローラーのSkeletonActivityからSkeletonActivity.javaを選択して,以下のコードを書き加えます。onPauseは,存在しないコードなので,各自追加してください。

    @Override
protected void onResume() {
    super.onResume();

    Log.d( "SkeletonActivity", "onResume" );
}

@Override
protected void onPause() {
    super.onPause();

    Log.d( "SkeletonActivity", "onPause" );
}

コードを追加すると,Logクラスをインポートしないとエラーとなるので,以下のクラスをインポートするようにして下さい。

#import android.util.Log;

著者プロフィール

傍島康雄(そばじまやすお)

5月30日生まれ。

モバイルデバイスが大好物。それで動くアプリの開発に喜びを感じている。スマートフォン前夜のWindows Mobile,PalmOSのアプリに情熱を傾けていたが,最近は停滞気味でコードを書くよりも文章を書く機会が多くなっており,文章を書くのも,プログラミングと同じくらい奥深い作業だと感じている。

ブログ:http://yasuos.com/blog/

コメント

  • Re:

    すみません。
    一生懸命書いてあることを理解しようと
    努めているのですが・・・

    コードを追加すると,Logクラスをインポートしないとエラーとなるので,以下のクラスをインポートするようにして下さい。

    やりたいことはわかりますが・・・どうやって?

    もう少しわかりやすく書いていただけると助かります

    知識の前提があるのでしょうか
    もし前提となる知識があるのでしたら
    それを明記していただけると助かります

    Commented : #6  知識の前提があるのでしょうか (2011/09/16, 23:09)

  • 日本語でおk

    >以下のコードを書き加えます。onPauseは,存在しないコードなので,各自追加してください。

    ???

    Commented : #5  aa (2011/06/03, 21:38)

  • バージョンの差?

    説明して頂いている図(各イベントの流れ)なのですが、
    http://developer.android.com/intl/ja/guide/topics/fundamentals.html
    を見る限り、2011/03/11時点では、
     「onPause()」
    からでも、
     「onCreate()」
    へ遷移するようなのですが・・・。
    これは、Androidのバージョンの差なのでしょうか?

    Commented : #4  たまのん (2011/03/12, 02:40)

  • 図の説明が違っていませんか。

    白いわにさんのコメントとは別の点で、Googleが配布しているドキュメントと、順序が違うところがあります。。

    (誤)
    OnStart()
     ↓
    OnCreate()

    (正)
    OnCreate()
     ↓
    OnStart()

    Googleドキュメント↓
    http://developer.android.com/intl/ja/guide/topics/fundamentals.html

    Commented : #3  名無し (2011/02/10, 16:35)

  • 図の説明がちょっと違っているような。

    onCreate() onResume()が2つづつあって、onStart(),onRestart()が無いですね。Googleの配布しているドキュメントと見比べながら読んでいますが、元が間違ってたのかな(今のGoogleのは修正済み)

     EclipseもSDKも更新が早くて、他の人のWebの説明も含めてなかなか書いてある通りには動きません(アプリじゃなくて、開発環境が)がぼちぼち勉強しています。

    Commented : #2  白いわにさん (2010/12/22, 15:33)

1ページ(1/2)    

コメントの記入