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


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

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

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 onPostCreate(Bundle savedInstanceState){
        super.onPostCreate(savedInstanceState);
        addStr("onPostCreate");
    }

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

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

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

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

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

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

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

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

    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 → onResume → onPostResume
の順で呼び出されています。

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



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

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



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

▼ホームボタンで閉じて再び、アイコンをクリックして起動させた場合には、



ホームボタンで閉じて再び、アイコンをクリックして起動させた場合には
onPause → onSaveInstanceState → onStop
で閉じた後、アイコンをクリックして起動させると、
onStart → onResume → onPostResume

起動中にonCreate が無いため onPostCreateもありません

▼タスクボタンを押してタスクを再び選択した場合



タスクボタンを押してタスクを再び選択した場合
onPause → onSaveInstanceState → onStop
で閉じた後、タスクを選択した場合
onStart → onResume → onPostResume

▼電源ボタンを押して画面を消して再び電源ボタンを押した場合には、



電源ボタンを押して画面を消して再び電源ボタンを押した場合には
onPause → onSaveInstanceState → onStop
画面が消えた後、電源ボタンを押して再表示
onStart → onResume → onPostResume


■関数の呼び出される順番としては、次のパターンがあるのが解りました。

▼開く順

画面を傾けた
onCreate → onStart → onRestoreInstanceState → onPostCreate → onResume → onPostResume
アイコンをクリックして起動
onCreate → onStart →  →  →  →  →  →  →   onPostCreate → onResume → onPostResume
タスクを選択した 電源ボタンを押した
            onStart →  →  →  →  →  →  →  →  →  →  →   onResume → onPostResume

▼閉じる順

画面を傾けた
onPause → onSaveInstanceState → onStop → onDestroy
戻るボタン
onPause →  →  →  →  →  → → onStop → onDestroy
ホームボタン タスクボタン 電源ボタン
onPause → onSaveInstanceState → onStop


ちなみに android 4.4.4で試しました。
バージョンにより結果が違うかもしれません。


▲トップページ > android