ニートが学ぶプログラミング

ニートの日記。プログラムのことやら、くだらないこと、思ったことをまとめていきます。頑張って毎日更新するぞぉ_(:3」∠)_ 更新が連続して途切れたら察してください。

Activityのライフサイクル Androidアプリってどんな風に動いてるの?

こんにちは、鬱太郎です。今日はAndroidアプリのライフサイクル「アクティビティのライフサイクル」について学んだのでそれをまとめたいと思います。

f:id:neet-utsu-taro:20170912122415p:plain

Activityクラス

Activity | Android Developers

上記ドキュメントから、クラスは

package android.app;
public class Activity extends ContextThemeWrapper 
implements LayoutInflater.Factory2, Window.Callback, KeyEvent.Callback, 
View.OnCreateContextMenuListener, ComponentCallbacks2

ということがわかります。継承の詳細は

パッケージ名 クラス名
java.lang Object
android.content Context
android.content ContextWrapper
android.view ContextThemeWrapper
android.app Activity

実装の詳細と主な内容は

インターフェース名 主な内容
LayoutInflater.Factory2 引数を元に新しいViewを作る関数を実装する
Window.Callback ディスプレイに関するイベントのコールバック関数を実装する
KeyEvent.Callback キーボードに関するイベントのコールバック関数を実装する
View.OnCreateContextMenuListener メニューを生成する関数を実装する
ComponentCallbacks2 システムが設定を変更したり、メモリが少なくなった際に呼ばれるコールバック関数を実装する

すべてのフィールドやメソッドを説明しきれないほど、Activityクラスは継承・実装がなされています。

アクティビティの状態遷移

developer.android.com

アクティビティーには基本的に3つの状態があります。

1.実行中(再開)状態

アクティビティが画面上にでて、ユーザーが操作できる状態。

2.一時停止状態

他のアクティビティが画面上に出てメインに表示されているが、このアクティビティも表示されている状態。このアクティビティの上に他のアクティビティが表示されているが、画面すべて覆われているわけではない状態。システムによっては強制終了される場合もある。

3.停止状態

他のアクティビティによって完全に見えない状態。アクティビティがバックグラウンドにある状態。システムによっては強制終了される場合がある。

通常は1の再開状態ですね。ホームボタンなどでアプリを終了し、右下のボタンからアプリを開ける状態を3の停止状態といえます。

Activityのメソッドとアクティビティの状態の関係

公式サイトにある図から

f:id:neet-utsu-taro:20170908191050p:plain
アクティビティの状態遷移の際に呼ばれるメソッドは

起動→実行中(再開状態)

onCreate->onStart->onResume

実行中→一時停止状態

onPause

一時停止状態or実行中→停止状態

(onPause->)onStop

一時停止状態→実行中

onResume

停止状態→実行中

onRestart->onStart->onResume

→終了

(onPause->onStop->)onDestroy

一番重要なメソッドはonCreate

Activityで一番重要なコールバックメソッドはonCreateです。上記にあるアクティビティのライフサイクルの図からも分かりますね。アクティビティが起動でした際に、プログラマが一番最初に操作できるメソッドがonCreateです。ここでレイアウトを設定したり、Listenerを設定したりします。

実際にプログラムを作って確かめてみよう

Activityのコールバックメソッドを追加

Android Studioを起動させ、各コールバックメソッドを追加しましょう追加した例は以下のようになります。

実行確認

実際にVMで実行してみて、いつコールバックメソッドが呼び出されるかを確認していきましょう。

説明しやすくするため私は各コールバックメソッドの末尾

try{
  Thread.sleep(1000);
}catch(InterruptionException e){
  e.printStackTrace();
}

を追加しました。コールバックメソッドが呼ばれ、メッセージを出力した後に1秒待機するものです。ですが、コールバックメソッドで長期間処理するのは好まれないと思うので、今回のテストだけにします。

起動→実行中(再開状態)

アプリを起動

f:id:neet-utsu-taro:20170912225609g:plain

「onResume」の後に画面が初期化されているのがポイントです。

一時停止状態or実行中→停止状態

ホームボタンを押す

f:id:neet-utsu-taro:20170912230352g:plain

ホームボタンを押した瞬間に「onPause」画面からアプリケーションが消えた後に「onStop」が呼び出されているのがポイントです。

履歴から別のアプリケーションを起動

f:id:neet-utsu-taro:20170916195624g:plain

履歴ボタンを押した瞬間に「onPause」画面が完全に小さくなってから「onStop」となるのがポイントです。

停止状態→実行中

履歴からアプリを起動

f:id:neet-utsu-taro:20170912230800g:plain

アプリを選択した瞬間に「onRestart」画面が表示されたままの状態でアプリが起動「onStart」「onResume」と続きます。停止状態でもアプリの状態を保存しているため、初回の起動時のように「onResume」まで待たなくても画面が出現します

→終了

履歴からアプリを消去

f:id:neet-utsu-taro:20170912231821g:plain

アプリを消去したと同時に「onDestroy」が出現onDestroyメソッド中のsleepを待たずに画面が消えました

終わりに

アクティビティのライフサイクル、いかがでしたか?私の知識経験不足のため、不完全なまとめとなってしまったこと申し訳なく思っています。

いろいろ調べてみた結果、onCreate以外使わないな!ってことがわかりました。そんな高度な開発しないですね。。。

記事書いてる最中に「あ、これ使わないな!」と思ったけど(ここまで書いたし、もったいないから投稿しよう)ということで、今回投稿しました。

ここまでご覧いただき、誠にありがとうございます。

またね(‘ω’)ノ

p.s.
関数とメソッドやActivityとアクティビティの表記ゆれ、ごめんなさい。Javaだとメソッドと統一したほうがいいのでしょうけれど、文字数の関係上(あるいはミス)関数としたりしています。アクティビティとActivityは前者がアプリケーション全体のことを指し、後者がクラスのように内部構造を表すものと認識しています。

リンク等まとめ

名称 リンク先
Activityクラスドキュメント https://developer.android.com/reference/android/app/Activity.html
アクティビティについて https://developer.android.com/guide/components/activities.html?hl=ja