今天宿舍一個哥們出去面試遇到了這個面試題:"在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);執行銷毀