Activity生命周期方法調用finish后的不同表現


今天宿舍一個哥們出去面試遇到了這個面試題:"在activity oncreate()調用finish()"生命周期是怎么樣的?

我趕緊寫了些demo,發現確實很有趣:

package com.example.okhttpdemo;

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

public class TestActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        finish();
        Log.i("TestActivity", "onCreate");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.i("TestActivity", "onDestroy");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.i("TestActivity", "onPause");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.i("TestActivity", "onRestart");
    }

    @Override
    protected void onResume() {
        super.onResume();

        Log.i("TestActivity", "onResume");
    }

    @Override
    protected void onStart() {
        super.onStart();

        Log.i("TestActivity", "onStart");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.i("TestActivity", "onStop");
    }

}

接下來看在生命周期不同回調里面finish()調用后的日志:

1,oncreate():經歷onStart(),onResume(),onPause(),onStop()方法

2,onstart()經歷onResume(),onPause()方法

3,onresume() 經歷onStart(),onResume(),onPause(),onStop()方法

4,onpause()

5,onstop()結果同上

6,onDestory()結果同上

 那么問什么是這個樣子的呢?(2016年4月24日00:01:37更新)

如下是github上面對於這個問題的探討:

https://github.com/android-cn/android-discuss/issues/430  

mInstrumentation.callActivityOnCreate(activity, r.state) 函數中會判斷:
  if (!r.activity.mFinished) {
  activity.performStart();
  r.stopped = false;
  }

執行完 onCreate()后,判斷這時 activity 有沒有finish ,沒有就會接着執行 onStart(),否則會調用 destory()

執行完 onStart()后會執行 handleResumeActivity 函數,其中performResumeActivity 函數中:

if (r != null && !r.activity.mFinished) {
    r.activity.performResume();
}

會調用 onResume 如果此時finish,就不會執行finish(),會調用ActivityManagerNative.getDefault()
.finishActivity(token, Activity.RESULT_CANCELED, null);執行銷毀


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM