dialog 弹框时activity生命周期调用过程

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/cdkd123/article/details/93078140

dialog 弹框时activity生命周期调用过程

这个问题,分两部分

  1. 在普通activity弹框dialog,activity的onPause方法会被调用吗?
  2. activity a中给dialog视图设置事件,再启动一个a,activity生命周期如何?

这是面试中遇到的两个问题,非常好奇当时有没有答对。

第一个问题,我当时回答:activity会调用 onPause方法

第二个问题,当时回答:
前一个acivity会调用 onPause, onSaveInstance, 后一个activity会调用 onCreate, onResume

现在看来,全都答错了

正确的答案是:

  1. 第一种情况,什么都不会发生
  2. 第二种情况:
    前一个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, 情况或许更复杂吧,暂不做深究。

展开阅读全文

没有更多推荐了,返回首页