Activity

1,678 阅读3分钟

1. 文章

  1. Dialog,系统下拉栏 对Activity的生命周期的影响 : 无影响
  1. Dialog的创建,只能用Activity作为Context?
  1. onPause
  1. 生命周期

2.零散的点

  1. Activity中弹出Dialog,不会触发Activity任何生命周期函数.
  2. 启动1个Activity,然后弹出Dialog,再进入第2个Activity.
//启动1个Activity
TagActivityLifeCycleActivityLife: onCreate
TagActivityLifeCycleActivityLife: onStart
TagActivityLifeCycleActivityLife: onResume

//弹出Dialog
//不会改变生命周期

//进入下一个Activity
TagActivityLifeCycleActivityLife: onPause

//下一个Activity
TagActivityLifeCycleActivity2Life: onCreate
TagActivityLifeCycleActivity2Life: onStart
TagActivityLifeCycleActivity2Life: onResume

TagActivityLifeCycleActivityLife: onStop
TagActivityLifeCycleActivityLife: onSaveInstanceState
  1. Activity的onPause

    • 当前Activity不再可交互,但是在屏幕上依然可见,会触发onPause.
    • 当前Activity的onPause必须执行结束,下一个Activity的onCreate才会执行.所以onPause中不能执行耗时逻辑.
    • onPause被调用,一定是另一个Activity参与进来了.
      • Toast,Dialog不会对当前Activity的生命周期产生影响,原因是它们只是使用WindowManager.addView(),并没有产生新的Activity.
      • 下拉通知栏挡住当前Activity,对当前Activity的生命周期也没有影响.
    android/app/Activity.java
        /**
        当前Activity不再可交互,但是在屏幕上依然可见,会触发onPause.
         * Called as part of the activity lifecycle when the user no longer actively interacts with the
         * activity, but it is still visible on screen. The counterpart to {@link #onResume}.
         *
        当前Activity的onPause必须执行结束,下一个Activity的onCreate才会执行.所以onPause中不能执行耗时逻辑. 
         */
        @CallSuper
        protected void onPause() {
    
  2. Activity生命周期

    • **必须要有另一个Activity的参与,才会引起当前Activity生命周期的变化.**Dialog,Toast,下拉通知栏都不涉及新的Activity,因而不会触发当前Activity生命周期变化.
  3. Activity.onWindowFocusChanged

    • 弹出Dialog,下拉栏,系统弹框等 '覆盖当前Activity' 的行为,会触发onWindowFocusChanged(boolean hasFocus)
    • hasFocus: tru-当前Activity获取到焦点 . false-当前Activity失去焦点.
  4. 创建Dialog只能用Activity的Context

     Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running?
        at android.view.ViewRootImpl.setView(ViewRootImpl.java:965)
        at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:387)
        at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:96)
        at android.app.Dialog.show(Dialog.java:344)
        at com.huanhailiuxin.jet2020.dialog.DialogActivity.showApplicationDialog(DialogActivity.java:24)
        ****
  1. Activity的onStop不一定会执行
  • Activity onStop不回调测试
  • Activity生命周期之onStop 何种情况不被调用。
    • onStop并没有被回调,居然是因为第二个被启动的Activity在onResume的时候判断数据有问题把自己finish了,第一个Activity直接就重新onResume了
    • B从视觉上就可以看到不能完全遮盖A,A不会执行onStop
    • B的android:theme中设置了窗体透明属性为true.
      • android:windowIsTranslucent 为true,(透明的,遮不住下面的Activity),被遮住的ActivityA 不会调用onStop()