Activity生命周期
Activity的生命周期,是日常编码非常重要的一环,扎实的掌握好这个基础,能为我们工作和面试带来很大的帮助,本文很多的知识都从《Android开发艺术探索》中来
Activity的生命周期流程图
疑问: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耗时。