【Androidアプリ開発】アクティビティとライフサイクルの重要性

Activityとライフサイクルのアイキャッチプログラミング

はじめに

 本記事ではAndroidアプリ開発における、重要な概念の一つであるライフサイクルについて、アクティビティ(Activity)を例にして説明していきます。

アクティビティ(Activity)とは

アクティビティ(Activity)について

 Androidアプリ開発におけるアクティビティ(以下Activity)とは、「Androidアプリの画面」のことを指しています。通常皆さんがアプリを開くときは、アプリアイコンなどを押した後に画面が開き、ボタンを押したり入力などを行うと思います。その時にボタンやテキストボックスが置かれている画面そのものを1つのActivityとして理解してください。
 多くのアプリでは画面は1つではなく複数の画面から成り立っていることが多く、その場合にはActivityも複数になります。
 ※Androidアプリ開発では1つのActivityに対してFragment(フラグメント)を利用して複数画面を作成する方法もありますので、詳しくは以下を参照してください。

アプリ画面の構成

 ここで画面を作成する時の構成を見てみましょう。

アプリの構成
アプリの構成

 Activityは様々な要素を持っており、画像のステータスバーやアクションバーなどの制御も可能になります。また、アプリとして必要なボタンやテキストボックスなどの要素(ビュー)もActivity内部に配置することができるます。

 プロジェクト内でのActivityの作り方については下記ページを参考に作成してみてください。

AndroidManifest.xmlへの宣言

 Activityを利用するときには、AndroidManifest.xmlへ宣言(定義)する必要があります。これはアプリがどんなActivityを持っていて、どんな設定がされているかを認識するためです。例としてデフォルトで作成されるMainActivityの<acitivty>タグを見てみましょう。

        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

name属性として.MainActivityと記述されていますが、これはMainActivity.ktクラスを指しています。また、intent-filterというタグがあると思いますが、こちらはaction, category, dataという属性を追加することができます。各要素についての説明は下記です。

タグ名説明
intent-filterアクティビティのインテントフィルタを定義するためのもの。
アクティビティが受け入れるアクションやデータのタイプを
action,category,dataとして定義する。
action実行するアクション名を示す文字列。上記コードの例では
ACTION_MAINというアプリを開いたときの初期Activity(画面)として定義するものです。
その他にもACTION_SENDのようなインテントで
他のアプリにデータを受け渡すために使うものや、ACTION_VIEWなどが存在します。
categoryインテントを処理するアクティビティの性質(通常はユーザー ジェスチャーや
アクションが開始された場所に関連)を示すものです。
上記コードの例のcategory.LAUNCHERはホームボタンから起動できる画面としての定義です。
dataインテントに関連付けられるデータを指定します。
例えば”scheme”,”host”,”port”,”path”,”mimeType”などを指定することができ、android:scheme=”http”のように指定します。
タグの説明

 Intentについての説明は下記にまとめてあります。

Activityのライフサイクル

ライフサイクルとは

 Androidアプリ開発ではライフサイクルを意識して開発することが特に重要で、例えば「アプリを利用している時に電話が掛かってきた場合」や「アプリ利用中に電源ボタンを押してスリープになった場合」などに、アプリがクラッシュするようでは良いアプリとは言えません。
 ライフサイクルとはActivityやFragment(フラグメント)がどのように生まれて、どのように破棄されるのかをサイクルとして定義しているものになります。ライフサイクルを考慮することによって、アプリが一時的に止まった時や再開した時に復帰できるように処理を作ることができます

Activityのライフサイクルの種類

 Googleが公式で出している、Activityのライフサイクルの流れを見てみましょう。

Activity ライフサイクル図
Activityのライフサイクル

 Activityが始まってから、終了するまでの一連の流れが示されています。続いて、たくさんの項目がありますが、各項目について表にまとめます。

項目説明利用用途
onCreate()Activityが作成された時に呼び出されるコールバック
全てのActivityで必ず呼び出す必要があり、1回だけ呼び出されます。
Activityが開始する時に呼び出されるため、
レイアウトの設定(setContentView)などに利用されます。
onStart()Activityが開始状態になると呼び出されるコールバック
開始状態はバックグラウンド状態から復帰した(フォアグラウンドに戻る)ときや
Activityの開始時に相当します
Activityの開始時に、レイアウトを初期化しておきたいときや、
ユーザー操作させるための設定に変更させる場合に利用します。
onResume()Activityが再開状態になったときに呼び出されるコールバック
堺状態は他のActivityから戻ってきたときや電話の着信から戻った時に相当します
他の画面から戻ってきた時にUIを変更したり、
端末のスリープから復帰した時に正常なアプリ動作に戻す時などに利用されます。
onPause()Acitivtyが停止状態になったときに呼び出されるコールバック
停止状態は他のActivityに移った時や、
電話の着信時などの一時的にActivityが非表示状態になったときに相当します
Activityが非表示になった時に保持して起きたいUIや設定値の保存などに利用されます。
onPause()は短時間で終了してしまうため、
データベースの保存などは利用してはいけません。
onStop()Activityが表示されなくなった時に呼び出されるコールバック
他のアプリが使用されるようになった場合などが該当します
データベースへ値を保存するときなどに利用します。
onDestoyActivityが破棄される前に呼び出されるコールバック
ユーザーが完全にアプリを閉じたり、画面の向きを変えたりすると、
Activityが破棄されるため、このコールバックが呼び出されます。
再度Activityが開いた時に、onCreateからライフサイクルが始まっても、アプリとして正しく機能するように
保存しておく状態やデータを全て記録するために利用します。
Activityライフサイクルの説明

ライフサイクルの動作確認

 実際にActivity内のライフサイクルがどのように動いているか、ソースコードを書いて確認してみましょう。今回はライフサイクルのonCreate、onStart()、onResume()、onPause()、onStop()、onDestroy()の6種類のコールバック関数に、ログを入れてアプリを動かしながら確認します。
 下記コードをMainActivityに記述しましょう。

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        Log.d("MainActivity","onCreate")
    }

    override fun onStart(){
        super.onStart()
        Log.d("MainActivity","onStart")
    }

    override fun onResume(){
        super.onResume()
        Log.d("MainActivity","onResume")
    }

    override fun onPause(){
        super.onPause()
        Log.d("MainActivity","onPause")
    }

    override fun onStop(){
        super.onStop()
        Log.d("MainActivity","onStop")
    }

    override fun onDestroy(){
        super.onDestroy()
        Log.d("MainActivity","onDestroy")
    }

 Log.dというのはログをデバッグとして出力するための関数です。
 ※Android Studioでログを確認するにはLogcatウィンドウを開きます。詳しくは動画を御覧ください。

 いかがでしょうか。アプリが「開く」、「閉じる」、「バックグラウンドに移る」などの動作によって、Activityのライフサイクルが変わることがLogcatで確認できましたでしょうか。
 どのAndroid端末でも、Activityのライフサイクルは同じですので、必ず覚えてください。また、ActivityではなくFragment(フラグメント)の場合だとライフサイクルは変わりますので、Androidアプリ開発ではライフサイクルを意識することが大切ということを覚えておきましょう。
 Fragment(フラグメント)のライフサイクルについては下記を見てみてください。

まとめ

 今回はActivity(アクティビティ)についてと、Activity(アクティビティ)におけるライフサイクルについて説明しました。Androidアプリ開発では特に重要な概念ですので、必ず覚えてください。

コメント