【Android】簡単にわかるActivityの基礎


前書き


Androidアプリを開発して間もない頃、

Activityって何なんだろう?」
ライフサイクルって何だろう?」
「公式リファレンスのAndroid Developers を見てもよく分からない。。。」

と感じたことはありませんか?

僕も最初の頃はActivityやライフサイクルと言われても
何をやっているのかよく分かっていませんでしたし、
Android Developersを読んでも、難しくてイメージがよく湧きませんでした。

本記事ではそんなちょっと固めの公式リファレンスを、
初心者向けに噛み砕いて、分かりやすいように説明していきたいと思います。

この記事を読んだ後に、公式リファレンスであるAndroid Developersを読んでいただけると
より理解が深まりやすくなります!


1.Activityとはなんなのか


Activityとはアプリの画面制御を担当しているクラスです。

ほとんどのアプリは画面が複数あります。
メールアプリで例えると、

・受信BOXの画面
・メール本文の画面
・メール送信の画面

….などなど

昔は下記のような感じで画面一つずつにActivityが存在していました。

・受信BOXの画面  MailBoxActivity.java
・メール本文の画面 MailDetailActivity.java
・メール送信の画面 MailSendActivity.java

「昔は」という表現をしたのは、
Android3.0(HoneyComb)のバージョンから、
Fragmentという画面の断片を担うものが登場したからです。

※Fragmentについてはまた別で紹介します。
このFragmentも、Activityから生成されます。

Activityは以下のようなお仕事をしています。

・アプリの起動命令を受けてアプリ画面の表示
・アプリ画面のレイアウトをリソースフォルダから取得
・アプリ画面がタッチされたことを検知
・アプリの終了命令を受けてアプリ画面の非表示

などなど
画像で表すとこんな感じです。

画面に関わること全体のお仕事をしています。
Activityの役割についてイメージできましたか??


2.Activityのライフサイクル


ライフサイクルの概念はAndroidアプリ開発にて必須になります。
Activityのライフサイクルとは、
画面の生成から、破棄されるまでの一連の流れのことです。

人間も生まれてから死ぬまで色々なイベントがあると思います。
0歳  誕生
6歳  小学校入学
20歳 成人
85歳 死去
など。

このような人間のイベントと同じように、
Activityも生成から破棄されるまで、様々なイベントがあります。
このことをライフサイクルイベントライフサイクルメソッドと呼びます。

ライフサイクルメソッドは、
画面の状態に応じて自動的に実行されるメソッドとなっています。
ここで、Activityのライフサイクルについて有名な図があるので、確認しましょう。

本当はもっと細かいライフサイクルメソッド色々がありますが、
今回はこの中から特によく使うライフサイクルメソッドについて説明します。


2-1.onCreate()

Activityにおいて、必ず実装しないといけないメソッドです。
画面が生成要求を受けたときに一番最初に実行されるメソッドです。
一般的なJavaアプリでのmainメソッドにあたるものだと考えればOKです。

このメソッドは起動してから、一度しか呼ばれることがないので、
一度しか行う必要がないService,BroadcastReceiveの設定や、
画面のレイアウトをsetContentView()というメソッドを使って
設定することを推奨されています。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
}

@Override のアノテーションは、「親クラスと同じ名前のメソッドを定義し直しています」
といった宣言になります。
オーバライドを行ったライフサイクルメソッドは、
super.onCreate() で親クラスのメソッドを呼び出した上で、
サブクラス独自の処理を記載していくのが基本です。

setContentView(R.layout.activity_main);
では、Activityで表示するレイアウト(ビュー)を決定しています。
MainActivity.javaでは、activity_mainというレイアウトに基づいた画面を表示します。
という意味になります。


2-2.onResume()

onStart()の後、画面がユーザに見える直前に実行されるメソッドです。
画面を表示した回数と、onResume()が呼ばれる回数は等しくなります。
画面が非表示になった後、再度表示する際も、このonResume()からスタートします。
画面に表示されるデータの設定を行なったりします。


2-3.onPause()

他アプリが前面に表示された時に実行されるメソッドです。
onPause()が実行された後は、
Activityがシステムにより破棄される可能性が出てくるため、
このタイミングで画面に入力されているデータなどを保存することが推奨されています。
再度画面を表示する際は、onResume()が呼ばれます。


2-4.onStop()

Homeに戻ったり画面が完全に見えなくなった時に、
onPause()の後に実行されるメソッドです。
再度画面を表示する際は、onRestart()を経由して、onStart()からスタートします。


2-5.onDestroy()

Activityが完全に破棄される時に実行されるメソッドです。
onCreate()に対応して一度しか呼ばれることはありません。
onCreate()で行ったServiceやBroadcastReceiverの解除を行います。


流れをまとめると、
下記のように順番にシステムからライフサイクルメソッドが呼び出されます。

Activitiyの起動要求

onCreate() 画面の生成
onResume() 画面表示直前
〜画面表示中〜
onPause() 他アプリの割り込み
onStart() 画面非表示
onDestory() 画面の破棄

onCreate()以外は実装しなくても問題はありません。
適切なタイミングで、
適切なライフサイクルイベントで、
適切な処理
実装できるようになりましょう!


3.Android StudioでActivityのライフサイクルを見る

実際にAndroid Studioを使って、Activityのライフサイクルを見てみましょう!

Android Studioのインストール方法はこちら

今回は、
[Start a new Android Studio Project]を選んだ際にデフォルトで作成される、
初期設定のアプリを使います。

↓のコードのように、各ライフサイクルメソッドを用意しログを仕込みます。
これで、ライフサイクルメソッドが呼ばれたタイミングで
logcatにログが出力されるようになり、呼ばれるタイミングがわかるようになりました。

package com.example.myapplication;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.i(TAG, "Life cycle test onCreate");
        setContentView(R.layout.activity_main);
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.i(TAG, "Life cycle test onStart");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.i(TAG, "Life cycle test onResume");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.i(TAG, "Life cycle test onPause");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.i(TAG, "Life cycle test onStop");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.i(TAG, "Life cycle test onDestroy");
    }
}

エミュレーター でアプリを開いたり閉じたりすると、
2.Activityのライフサイクル
で説明したタイミングでログが出力がされることを確認できると思います。

Activityのライフサイクルを理解していれば、このログを見るだけで、
onResumeが3回来ている
→3回画面が開かれたんだろうな
onStopが2回来ている
→2回画面が非表示になったんだろうな

などとアプリの動きを解析することができます。


まとめ

いかがでしたでしょうか。
Activityの役割、Activityのライフサイクルについてイメージを掴むことはできたでしょうか。
もしこの記事で大体のイメージが掴めたということであれば、
Androidの公式リファレンスである下記のAndroid Developersを
一読してみることをお勧めします。

Android Developers アクティビティの概要
Android Developers アクティビティのライフサイクルについて

ご精読ありがとうございました!!

【Android】簡単にわかるActivityの基礎」への1件のフィードバック

  1. ピンバック: 一番簡単なFragmentの実装方法 生成と切り替え【Android】 | Memento Mori Blog

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です