Activity 系列知识 (一) ——正常生命周期

99 阅读1分钟

Activity生命周期

Activity的生命周期,是日常编码非常重要的一环,扎实的掌握好这个基础,能为我们工作和面试带来很大的帮助,本文很多的知识都从《Android开发艺术探索》中来

Activity的生命周期流程图

25eeaf30b20b66988652cf1997ccd9d5.jpeg

疑问:Activity A启动Activity B时,onPause和onResume的调用顺序

解答
抛开繁琐的调用链流程,我们找到resumeTopActivityInnerLocked方法,省略代码如下:

private boolean resumeTopActivityInnerLocked(ActivityRecord prev, ActivityOptions options){
    ...
    
    if (mResumedActivity != null) {
        if (DEBUG_STATES) Slog.d(TAG_STATES,
                "resumeTopActivityLocked: Pausing " + mResumedActivity);
        pausing |= startPausingLocked(userLeaving, false /* uiSleeping */, next);
    }
    ...
}

也即是在调用从A->B时,会先调用A.onPause,在调用B.onResume。那么知道这个知识,能为我们开发带来什么帮助呢?

验证
Activity A

class OneActivity : AppCompatActivity() {
    companion object{
        const val TAG = "OneActivity"
    }
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        findViewById<Button>(R.id.start_second_btn).setOnClickListener {
            startActivity(Intent(this@OneActivity, SecondActivity::class.java))
        }
    }

    override fun onPause() {
        Log.d(TAG,"onPause")
        super.onPause()
    }
}

Activity B

class SecondActivity : AppCompatActivity() {
    companion object{
        const val TAG = "SecondActivity"
    }
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_second)
    }

    override fun onResume() {
        Log.d(TAG,"onResume")
        super.onResume()
    }
}

结果日志:

OneActivity             com.ifreedomer.activityempty         D  onPause
SecondActivity          com.ifreedomer.activityempty         D  onResume

收益
假设A->B过程中,启动发生了卡顿,那么依据已有知识,我们的排查路径将会非常明确。先分析A.onPause耗时,在分析B.onResume耗时。