【Android】アプリケーションフレームワークのActivity Managerについて調べてみた

Androidの開発を行う上で、Androidの構造を理解しておいたほうが、効率がよいだろうと考えました。
作成したアプリを実行し、操作を行い、アプリを停止するまでの間に何が起こっているのだろうか?
今回は、Activity Managerの働きについて見ていこうと思います。

目次


  1. Activity Managerとは
  2. アクティビティとは
  3. アクティビティの状態がわかるプログラムを作る

1.Activity Managerとは


色々なサイトや文献を見てみると、「Activity Managerクラスを利用することで、Linuxカーネル上の電話管理用のデバイスドライバー電源を管理するデバイスドライバーとやり取りでして、現在起動中のアプリケーションのアクティビティに状況の変化を通知できるようになります。」のようなことが書かれています。基礎知識がないと理解しにくいですが、どうやら表示中のアクティビティに電話がかかってくる等のもしもの変化があった場合に、Acitivity Managerのオブジェクトが通知してくれるようです。Activity Managerを知るにはアクティビティを知る必要がありそうですね。


2.アクティビティとは


Activity(アクティビティ)はアプリの操作画面の土台となる部分を作ります。このアクティビティの上にボタンやテキストビュー等のUI部品を配置することで、実際に「目に見える」画面を作ることが出来ます。
しかし、スマホをお持ちの方ならわかると思いますが、アプリを起動中にホーム画面に戻ったり、他のアプリを起動する等によりアプリの表示と非表示を切り替えるかと思います。Androidでは、このような画面の起動から終了までをアクティビティのライフサイクルで表します。

アクティビティのライフサイクル1

また、実行中のアクティビティの状態には、「アクティビティが見える(画面の最前面に表示)状態」と「アクティビティが見えていて操作ができる状態」の2つがあります。

アクティビティのライフサイクル2

各メソッドの説明は以下のとおりです。

メソッドの説明


3.アクティビティの状態がわかるプログラムを作る


図や表を目で見ても理解するのが難しいので、アクティビティの状態がわかるプログラムを作ってみましょう。

プロジェクトの作成については、こちらをご確認ください。

①MainActivity.javaファイルを以下のように編集します。
※今回はactivity_main.xmlは編集しません。

package com.example.User.activitycheck;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;    //追加します

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        Log.i("ActivityTest", "onCreate()");  //追加します ログを出力
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    
    @Override
    protected void onStart(){
        Log.i("ActivityTest", "onStart()");   //ログを出力
        super.onStart();                      //スーパークラスのメソッドを呼び出す   
    }

    @Override
    protected void onRestart(){
        Log.i("ActivityTest", "onRestart()"); //ログを出力
        super.onRestart();                    //スーパークラスのメソッドを呼び出す
    }

    @Override
    protected void onResume(){
        Log.i("ActivityTest", "onResume()");  //ログを出力
        super.onResume();                     //スーパークラスのメソッドを呼び出す
    }

    @Override
    protected void onPause(){
        Log.i("ActivityTest", "onPause()");   //ログを出力
        super.onPause();                      //スーパークラスのメソッドを呼び出す
    }

    @Override
    protected void onStop(){
        Log.i("ActivityTest", "onStop()");    //ログを出力
        super.onStop();                       //スーパークラスのメソッドを呼び出す
    }

    @Override
    protected void onDestroy(){
        Log.i("ActivityTest", "onDestroy()"); //ログを出力
        super.onDestroy();                    //スーパークラスのメソッドを呼び出す
    }
}

②アプリを実行します。
「▶(Run’app’)」ボタン又はRunメニューのRun’app’を選択し、作成済みのAVDを選択して「OK」ボタンをクリックします。

③アプリを実行するとlogcatウィンドウが表示されます。このまま起動中のAVDを操作して、アクティビティを確認したいのですが、すべてのログから探し出すのは面倒なので、ログを絞り込みたいと思います。
logcatウィンドウ内の右上にあるドロップダウンリストからEdit Filter Configurationを選択します。

logcatfilter_choose

④Filter Nameには「Unnamed-0」となっていますので、任意の名前に変更します。今回は「ActivityCheck」と入力しておきます。また、Log Tagにはタグとして指定した値を入力し、「OK」ボタンをクリックします。

logcatfilter_dialog

⑤以下はアプリ起動直後のログです。Create()の後、onStart()、OnResume()が呼び出されていることがわかります。OnResume()であることからアクティビティを操作できる状態となります。

%e3%82%a2%e3%83%97%e3%83%aa%e8%b5%b7%e5%8b%95%e7%9b%b4%e5%be%8c%e3%81%ae%e3%82%a2%e3%82%af%e3%83%86%e3%82%a3%e3%83%93%e3%83%86%e3%82%a3

⑥次に起動しているAVDのホームボタンをタップします。AVDはホーム画面を表示し、ログにはonPause()、onStop()が呼び出されています。つまり、アクティビティの操作ができない状態となり、アクティビティの表示終了となります。

%e3%83%9b%e3%83%bc%e3%83%a0%e7%94%bb%e9%9d%a2%e3%82%bf%e3%83%83%e3%83%97%e5%be%8c%e3%81%ae%e3%83%ad%e3%82%b0

⑦アプリを再表示する為に、ホーム画面のランチャーアイコンをタップし、実行中のアプリのアイコンをタップします。

%e3%83%a9%e3%83%b3%e3%83%81%e3%83%a3%e3%83%bc%e3%82%a2%e3%82%a4%e3%82%b3%e3%83%b3%e3%82%92%e3%82%bf%e3%83%83%e3%83%97 %e5%ae%9f%e8%a1%8c%e4%b8%ad%e3%81%ae%e3%82%a2%e3%83%97%e3%83%aa%e3%82%92%e3%82%bf%e3%83%83%e3%83%97

ログには、onRestart()、onStart()、onResume()が呼び出されます。つまり、アプリが再び表示されて、操作できる状態になりました。

%e3%82%a2%e3%83%97%e3%83%aa%e5%86%8d%e5%ae%9f%e8%a1%8c%e5%be%8c%e3%81%ae%e3%83%ad%e3%82%b0

⑧最後に、AVDの戻るボタンをタップします。するとログには、onPause()、onStop()、onDestroy()が呼び出されます。操作できない状態となり、表示終了後、アクティビティが破棄された状態となります。これにより、アクティビティはライフサイクルから抜けることになります。

%e3%82%a2%e3%83%97%e3%83%aa%e7%b5%82%e4%ba%86%e5%be%8c%e3%81%ae%e3%83%ad%e3%82%b0

アプリが終了するまでの動作を実際に動かすことで、アクティビティの状態がわかりやすくなりました。アクティビティを抑えておくことで、Activity Managerの働きが少しでも理解できたかと思います。