dialog 弹框时activity生命周期调用过程
这个问题,分两部分
- 在普通activity弹框dialog,activity的onPause方法会被调用吗?
- activity a中给dialog视图设置事件,再启动一个a,activity生命周期如何?
这是面试中遇到的两个问题,非常好奇当时有没有答对。
第一个问题,我当时回答:activity会调用 onPause方法
第二个问题,当时回答:
前一个acivity会调用 onPause, onSaveInstance, 后一个activity会调用 onCreate, onResume
现在看来,全都答错了
正确的答案是:
- 第一种情况,什么都不会发生
- 第二种情况:
前一个activity会调用onPause, 第二个activity会调用onCreate, onStart, onResume, 接着调用第一个activity的onSaveInstance ,onStop
不信看代码和日志:
activity代码:
class DialogLifeCycleActivity : FragmentActivity() {
fun onShowDialog(view: View) {
var dialog = Dialog(this)
val view = View.inflate(this, R.layout.dialog_content, null)
dialog.setContentView(view)
view.setOnClickListener {
// 事件1
dialog.dismiss()
var intent = Intent(view.context, DialogLifeCycleActivity::class.java)
startActivity(intent)
}
dialog.show()
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Log.i("--act", "onCreate")
setContentView(R.layout.activity_dialog_life_cycle)
}
override fun onStart() {
super.onStart()
Log.i("--act", "onStart")
}
override fun onRestart() {
super.onRestart()
Log.i("--act", "onRestart -->")
}
override fun onRestoreInstanceState(savedInstanceState: Bundle) {
super.onRestoreInstanceState(savedInstanceState)
Log.i("--act", "onRestoreInstanceState -->")
}
override fun onSaveInstanceState(outState: Bundle?) {
super.onSaveInstanceState(outState)
Log.i("--act", "onSaveInstanceState -->")
}
override fun onPause() {
super.onPause()
Log.i("--act", "onPause -->")
}
override fun onStop() {
super.onStop()
Log.i("--act", "onStop -->")
}
override fun onDestroy() {
super.onDestroy()
Log.i("--act", "onDestroy -->")
}
}
上面activity就展示了一个按钮,文字叫“弹出对话框“, 点击后 show 一个 Dialog(), dialog就是一个普通按钮,包含一个”确定“按钮。
activity启动,执行:
2019-06-20 17:41:37.409 8948-8948/graphic.com.texiao I/--act: onCreate -->graphic.com.texiao.dialoglifecycle.DialogLifeCycleActivity@3c81026
2019-06-20 17:41:37.438 8948-8948/graphic.com.texiao I/--act: onStart -->graphic.com.texiao.dialoglifecycle.DialogLifeCycleActivity@3c81026
2019-06-20 17:41:37.440 8948-8948/graphic.com.texiao I/--act: onResume -->graphic.com.texiao.dialoglifecycle.DialogLifeCycleActivity@3c81026
当点击activity
按钮,执行:onShowDialog
方法, onPause
方法并没有执行,什么原因?
- 因为dialog依附于
activity
, 并没有被遮挡。
当点击 dialog ,触发事件1时,出现了如下log:
2019-06-20 17:41:40.590 8948-8948/graphic.com.texiao I/--act: onPause -->graphic.com.texiao.dialoglifecycle.DialogLifeCycleActivity@3c81026
2019-06-20 17:41:40.614 8948-8948/graphic.com.texiao I/--act: onCreate -->graphic.com.texiao.dialoglifecycle.DialogLifeCycleActivity@7ace2ae
2019-06-20 17:41:40.630 8948-8948/graphic.com.texiao I/--act: onStart -->graphic.com.texiao.dialoglifecycle.DialogLifeCycleActivity@7ace2ae
2019-06-20 17:41:40.633 8948-8948/graphic.com.texiao I/--act: onResume -->graphic.com.texiao.dialoglifecycle.DialogLifeCycleActivity@7ace2ae
2019-06-20 17:41:41.103 8948-8948/graphic.com.texiao I/--act: onSaveInstanceState -->graphic.com.texiao.dialoglifecycle.DialogLifeCycleActivity@3c81026
2019-06-20 17:41:41.104 8948-8948/graphic.com.texiao I/--act: onStop -->graphic.com.texiao.dialoglifecycle.DialogLifeCycleActivity@3c81026
在上面,我们看到
- 旧
activity @3c81026
调用activity
执行了onPause
后 - 新
activity @7ace2ae
调用onCreate
,onStart
,onResume
- 然后旧
activity @3c81026
又执行onSaveInstanceState
,onStop
!!
可以注意到, 旧activity 的 onStop方法,并不是立即就调用的,而是等到 新activity创建成功后,才执行,这个过程时不一定的。
如果给Activity 加上 flag_action
, 情况或许更复杂吧,暂不做深究。