●起動してからの関数の呼び出される順番を調べる


アプリケーションが起動してからonCreateが呼び出されることは知っていましたが、
その他の関数がどのタイミングでどの順番で呼び出されるかよくわかりませんでした。

しかも、画面を縦から横に傾けたり、アプリケーションを閉じた後、開きなおしたりすると、
呼び出される関数の順番や種類が変化します。
実際に見てみないとよくわからないということで、
そこで、呼び出された関数が表示されるプログラムを作りました。


package com.example.test.myapplication;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;


public class MainActivity extends AppCompatActivity {
    static final String msg="画面をマルチタッチ(二本指でタッチ)すると画面がリセットされます\n";
    static String str=msg;
    android.widget.TextView _textview;
    scrollview sv;
    static int x,y;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        sv =new scrollview(this);
        android.widget.LinearLayout ll=new android.widget.LinearLayout(this);
        _textview=new android.widget.TextView(this);
        sv.addView(ll);
        ll.addView(_textview);
        setContentView(sv);
        addStr("onCreate");
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        addStr("onSaveInstanceState");
    }
    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        addStr("onRestoreInstanceState");
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        addStr("onDestroy");
    }

    @Override
    protected void onPostCreate(Bundle savedInstanceState){
        super.onPostCreate(savedInstanceState);
        addStr("onPostCreate");
    }

    @Override
    protected void onPostResume(){
        super.onPostResume();
        addStr("onPostResume");
    }

    @Override
    protected void onStart(){
        super.onStart();
        addStr("onStart");
    }

    @Override
    protected void onStop(){
        super.onStop();
        addStr("onStop");
    }

    class scrollview extends android.widget.ScrollView {
        public scrollview(android.content.Context context) {
            super(context);
        }
        @Override
        public boolean onTouchEvent( android.view.MotionEvent ev ) {
            if(1<ev.getPointerCount()) {
                str = msg;
                _textview.setText(str);
            }
            return super.onTouchEvent(ev);
        }
    };
    private void addStr(String c){
        str=str+c+"\n";
        _textview.setText(str);
    }
}


このプログラムは画面を二本の指でタッチすると表示されている文字列がリセットされます。
ちょっと変なUIですね(笑

上のプログラムをコンパイルして作成した実行ファイル

func_oder1.apk

実際にプログラムを実行してみると、

通常の起動では、onCreate → onStart → onPostCreate → onPostResume
の順で呼び出されています。

次に画面の文字をリセットして画面を横に傾けてみました。

画面を傾けた場合には、
onSaveInstanceState → onStop → onDestroy
で、終了した後に再び起動して、
onCreate → onStart → onRestoreInstanceState → onPostCreate → onPostResume
のメソッドが呼び出されています。

アプリケーションを戻るボタンで閉じて再び、アイコンをクリックして起動させた場合には、

戻るボタンで閉じて再び、アイコンをクリックして起動させた場合には、
onStop → onDestroy
で終了したあとに、通常と同じ起動順のようです。
onCreate → onStart → onPostCreate → onPostResume

画面を表示した状態で電源ボタンを押して画面を消した後に、
再び電源ボタンを押した場合には、

onSaveInstanceState → onStop
で停止した後、
onStart
で再開しているようです。
なぜ、onSaveInstanceStateが呼び出されているのかはよくわからないですね。
ちなみに android 4.4.4で試しました。
バージョンにより結果が違うかもしれません。


▲トップページ > android