1. 程式人生 > >Activity與Fragment同時執行時生命週期執行順序探究

Activity與Fragment同時執行時生命週期執行順序探究

Fragment在開發中是可用以替代Activity的一種輕量級介面,它的生命週期如下圖所示
這裡寫圖片描述
與Activity對應的生命週期如下圖所示
這裡寫圖片描述
現要研究的是當Activity的生命週期變化會讓Fragment的生命週期發生什麼樣的變化.
在activity的layout中放置一個fragment,讓其在介面開啟時自動載入,然後再放置一個framelayout用以動態載入fragment,觀察兩者的生命週期與Activity間關聯。
佈局如下:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".fragment.FragmentNormalActivity">
<fragment
android:id="@+id/fragment_title" android:name="cn.pigdreams.blogdemo.fragment.TitleFragment" android:layout_width="match_parent" android:layout_height="94dp" android:layout_marginBottom="8dp" android:layout_marginEnd="8dp" android:layout_marginStart
="8dp" android:layout_marginTop="8dp" app:layout_constraintBottom_toTopOf="@+id/guideline4" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.0" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" />
<FrameLayout android:id="@+id/fl_container" android:layout_width="match_parent" android:layout_height="0dp" android:layout_marginBottom="8dp" android:layout_marginEnd="8dp" android:layout_marginStart="8dp" android:layout_marginTop="8dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="@+id/guideline4" app:layout_constraintVertical_bias="1.0" /> <android.support.constraint.Guideline android:id="@+id/guideline4" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" app:layout_constraintGuide_percent="0.2" /> </android.support.constraint.ConstraintLayout>

這裡寫圖片描述

1.首次開啟介面時

09-04 21:34:48.396 6975-6975/cn.pigdreams.blogdemo D/BLOG_DEMO: Activity:onCreate
09-04 21:34:48.608 6975-6975/cn.pigdreams.blogdemo D/BLOG_DEMO: Fragment:Title->onAttach
09-04 21:34:48.609 6975-6975/cn.pigdreams.blogdemo D/BLOG_DEMO: Fragment:Title->onCreate
09-04 21:34:48.617 6975-6975/cn.pigdreams.blogdemo D/BLOG_DEMO: Fragment:Title->onCreateView
09-04 21:34:48.701 6975-6975/cn.pigdreams.blogdemo D/BLOG_DEMO: Fragment:Title->onActivityCreated
09-04 21:34:48.740 6975-6975/cn.pigdreams.blogdemo D/BLOG_DEMO: Fragment:null->onAttach
09-04 21:34:48.741 6975-6975/cn.pigdreams.blogdemo D/BLOG_DEMO: Fragment:null->onCreate
09-04 21:34:48.743 6975-6975/cn.pigdreams.blogdemo D/BLOG_DEMO: Fragment:示例1A->onCreateView
09-04 21:34:48.762 6975-6975/cn.pigdreams.blogdemo D/BLOG_DEMO: Fragment:示例1A->onActivityCreated
09-04 21:34:48.763 6975-6975/cn.pigdreams.blogdemo D/BLOG_DEMO: Fragment:Title->onStart
09-04 21:34:48.764 6975-6975/cn.pigdreams.blogdemo D/BLOG_DEMO: Fragment:示例1A->onStart
    Activity:onStart
09-04 21:34:48.773 6975-6975/cn.pigdreams.blogdemo D/BLOG_DEMO: Activity:onResume
09-04 21:34:48.775 6975-6975/cn.pigdreams.blogdemo D/BLOG_DEMO: Fragment:Title->onResume
    Fragment:示例1A->onResume

  • 啟動時一般都是先執行Activity的生命週期,再執行Fragment的
  • 除了Fragment的onStart()先於Activity的onStart()先執行這一個特例
  • 正常啟動時每個Fragment的onAttach->onActivityCreated這四個生命週期一般都是一組一起執行的,在執行完這一組方法前不會去執行其它Fragment的生命週期方法

這裡寫圖片描述

2.Home鍵回到主介面時又返回時

09-04 21:37:56.725 7308-7308/cn.pigdreams.blogdemo D/BLOG_DEMO: Activity:onPause
    Fragment:Title->onPause
    Fragment:示例1A->onPause
09-04 21:37:56.749 7308-7308/cn.pigdreams.blogdemo D/BLOG_DEMO: Activity:onSaveInstanceState
09-04 21:37:56.751 7308-7308/cn.pigdreams.blogdemo D/BLOG_DEMO: Fragment:Title->onSaveInstanceState
    Fragment:示例1A->onSaveInstanceState
09-04 21:37:56.767 7308-7308/cn.pigdreams.blogdemo D/BLOG_DEMO: Activity:onStop
09-04 21:37:56.768 7308-7308/cn.pigdreams.blogdemo D/BLOG_DEMO: Fragment:Title->onStop
    Fragment:示例1A->onStop
09-04 21:38:14.097 7308-7308/cn.pigdreams.blogdemo D/BLOG_DEMO: Activity:onRestart
09-04 21:38:14.101 7308-7308/cn.pigdreams.blogdemo D/BLOG_DEMO: Fragment:Title->onStart
    Fragment:示例1A->onStart
    Activity:onStart
09-04 21:38:14.102 7308-7308/cn.pigdreams.blogdemo D/BLOG_DEMO: Activity:onResume
09-04 21:38:14.104 7308-7308/cn.pigdreams.blogdemo D/BLOG_DEMO: Fragment:Title->onResume
09-04 21:38:14.105 7308-7308/cn.pigdreams.blogdemo D/BLOG_DEMO: Fragment:示例1A->onResume
  • onSaveInstanceState()儲存狀態的方法是在onPause()之後,onStop()之前,Activity與Fragment在這裡是同步的
  • 再次從最近活動返回時,activity會多執行一個onRestart()方法,Fragment無此方法
  • Activity#onStart()始終處於Fragment#onStart()後面執行
  • Fragment的onResume()是最後執行的

這裡寫圖片描述

3.正常銷燬時

09-04 21:47:23.314 7308-7308/cn.pigdreams.blogdemo D/BLOG_DEMO: Activity:onPause
    Fragment:Title->onPause
09-04 21:47:23.315 7308-7308/cn.pigdreams.blogdemo D/BLOG_DEMO: Fragment:示例1A->onPause
09-04 21:47:23.938 7308-7308/cn.pigdreams.blogdemo D/BLOG_DEMO: Activity:onStop
09-04 21:47:23.940 7308-7308/cn.pigdreams.blogdemo D/BLOG_DEMO: Fragment:Title->onStop
    Fragment:示例1A->onStop
09-04 21:47:23.941 7308-7308/cn.pigdreams.blogdemo D/BLOG_DEMO: Activity:onDestroy
09-04 21:47:23.943 7308-7308/cn.pigdreams.blogdemo D/BLOG_DEMO: Fragment:Title->onDestroyView
    Fragment:Title->onDestroy
09-04 21:47:23.944 7308-7308/cn.pigdreams.blogdemo D/BLOG_DEMO: Fragment:Title->onDetach
    Fragment:示例1A->onDestroyView
09-04 21:47:23.947 7308-7308/cn.pigdreams.blogdemo D/BLOG_DEMO: Fragment:示例1A->onDestroy
    Fragment:示例1A->onDetach
  • 正常銷燬時(finish)不會執行onSaveInstanceState()這個儲存狀態的方法
  • 銷燬過程Activity的生命週期方法始終在Fragment之前執行
  • Fragment的onDestroyView->onDetach,一起執行

這裡寫圖片描述

4.在後臺被意外銷燬又從最近活動重新回到介面時

09-04 22:45:16.529 9894-9894/cn.pigdreams.blogdemo D/BLOG_DEMO: Fragment:null->onAttach
09-04 22:45:16.530 9894-9894/cn.pigdreams.blogdemo D/BLOG_DEMO: Fragment:null->onCreate
    Activity:onCreate
09-04 22:45:16.576 9894-9894/cn.pigdreams.blogdemo D/BLOG_DEMO: Fragment:Title->onAttach
09-04 22:45:16.577 9894-9894/cn.pigdreams.blogdemo D/BLOG_DEMO: Fragment:Title->onCreate
09-04 22:45:16.578 9894-9894/cn.pigdreams.blogdemo D/BLOG_DEMO: Fragment:Title->onCreateView
09-04 22:45:16.600 9894-9894/cn.pigdreams.blogdemo D/BLOG_DEMO: Fragment:Title->onActivityCreated
    Fragment:示例1A->onCreateView
09-04 22:45:16.606 9894-9894/cn.pigdreams.blogdemo D/BLOG_DEMO: Fragment:示例1A->onActivityCreated
09-04 22:45:16.609 9894-9894/cn.pigdreams.blogdemo D/BLOG_DEMO: Fragment:Title->onStart
    Fragment:示例1A->onStart
    Activity:onStart
09-04 22:45:16.610 9894-9894/cn.pigdreams.blogdemo D/BLOG_DEMO: Activity:onRestoreInstanceState
09-04 22:45:16.614 9894-9894/cn.pigdreams.blogdemo D/BLOG_DEMO: Activity:onResume
09-04 22:45:16.617 9894-9894/cn.pigdreams.blogdemo D/BLOG_DEMO: Fragment:Title->onResume
    Fragment:示例1A->onResume
  • 與正常啟動最大的不同在於activity持有的Fragment會優先被還原,最先執行Fragment的onAttach和onCreate方法
  • Activity會額外執行一個還原狀態的方法onRestoreInstanceState,介於onStart和onResume之間

這裡寫圖片描述

5.橫豎屏切換時

切橫屏

09-04 21:40:00.502 7308-7308/cn.pigdreams.blogdemo D/BLOG_DEMO: Activity:onPause
    Fragment:Title->onPause
    Fragment:示例1A->onPause
09-04 21:40:00.504 7308-7308/cn.pigdreams.blogdemo D/BLOG_DEMO: Activity:onSaveInstanceState
    Fragment:Title->onSaveInstanceState
    Fragment:示例1A->onSaveInstanceState
09-04 21:40:00.517 7308-7308/cn.pigdreams.blogdemo D/BLOG_DEMO: Activity:onStop
09-04 21:40:00.518 7308-7308/cn.pigdreams.blogdemo D/BLOG_DEMO: Fragment:Title->onStop
    Fragment:示例1A->onStop
09-04 21:40:00.519 7308-7308/cn.pigdreams.blogdemo D/BLOG_DEMO: Activity:onDestroy
    Fragment:Title->onDestroyView
09-04 21:40:00.520 7308-7308/cn.pigdreams.blogdemo D/BLOG_DEMO: Fragment:Title->onDestroy
    Fragment:Title->onDetach
    Fragment:示例1A->onDestroyView
09-04 21:40:00.524 7308-7308/cn.pigdreams.blogdemo D/BLOG_DEMO: Fragment:示例1A->onDestroy
    Fragment:示例1A->onDetach
09-04 21:40:00.663 7308-7308/cn.pigdreams.blogdemo D/BLOG_DEMO: Fragment:null->onAttach
    Fragment:null->onCreate
09-04 21:40:00.664 7308-7308/cn.pigdreams.blogdemo D/BLOG_DEMO: Activity:onCreate
09-04 21:40:00.696 7308-7308/cn.pigdreams.blogdemo D/BLOG_DEMO: Fragment:Title->onAttach
    Fragment:Title->onCreate
09-04 21:40:00.697 7308-7308/cn.pigdreams.blogdemo D/BLOG_DEMO: Fragment:Title->onCreateView
09-04 21:40:00.719 7308-7308/cn.pigdreams.blogdemo D/BLOG_DEMO: Fragment:Title->onActivityCreated
09-04 21:40:00.721 7308-7308/cn.pigdreams.blogdemo D/BLOG_DEMO: Fragment:示例1A->onCreateView
09-04 21:40:00.728 7308-7308/cn.pigdreams.blogdemo D/BLOG_DEMO: Fragment:示例1A->onActivityCreated
    Fragment:Title->onStart
    Fragment:示例1A->onStart
    Activity:onStart
09-04 21:40:00.729 7308-7308/cn.pigdreams.blogdemo D/BLOG_DEMO: Activity:onRestoreInstanceState
09-04 21:40:00.735 7308-7308/cn.pigdreams.blogdemo D/BLOG_DEMO: Activity:onResume
09-04 21:40:00.737 7308-7308/cn.pigdreams.blogdemo D/BLOG_DEMO: Fragment:Title->onResume
    Fragment:示例1A->onResume

切豎屏

09-04 21:43:07.771 7308-7308/cn.pigdreams.blogdemo D/BLOG_DEMO: Activity:onPause
    Fragment:Title->onPause
09-04 21:43:07.772 7308-7308/cn.pigdreams.blogdemo D/BLOG_DEMO: Fragment:示例1A->onPause
    Activity:onSaveInstanceState
09-04 21:43:07.775 7308-7308/cn.pigdreams.blogdemo D/BLOG_DEMO: Fragment:Title->onSaveInstanceState
09-04 21:43:07.776 7308-7308/cn.pigdreams.blogdemo D/BLOG_DEMO: Fragment:示例1A->onSaveInstanceState
09-04 21:43:07.789 7308-7308/cn.pigdreams.blogdemo D/BLOG_DEMO: Activity:onStop
    Fragment:Title->onStop
    Fragment:示例1A->onStop
    Activity:onDestroy
09-04 21:43:07.790 7308-7308/cn.pigdreams.blogdemo D/BLOG_DEMO: Fragment:Title->onDestroyView
09-04 21:43:07.791 7308-7308/cn.pigdreams.blogdemo D/BLOG_DEMO: Fragment:Title->onDestroy
    Fragment:Title->onDetach
    Fragment:示例1A->onDestroyView
09-04 21:43:07.794 7308-7308/cn.pigdreams.blogdemo D/BLOG_DEMO: Fragment:示例1A->onDestroy
09-04 21:43:07.801 7308-7308/cn.pigdreams.blogdemo D/BLOG_DEMO: Fragment:示例1A->onDetach
09-04 21:43:07.962 7308-7308/cn.pigdreams.blogdemo D/BLOG_DEMO: Fragment:null->onAttach
    Fragment:null->onCreate
09-04 21:43:07.965 7308-7308/cn.pigdreams.blogdemo D/BLOG_DEMO: Activity:onCreate
09-04 21:43:08.016 7308-7308/cn.pigdreams.blogdemo D/BLOG_DEMO: Fragment:Title->onAttach
    Fragment:Title->onCreate
09-04 21:43:08.017 7308-7308/cn.pigdreams.blogdemo D/BLOG_DEMO: Fragment:Title->onCreateView
09-04 21:43:08.030 7308-7308/cn.pigdreams.blogdemo D/BLOG_DEMO: Fragment:Title->onActivityCreated
09-04 21:43:08.031 7308-7308/cn.pigdreams.blogdemo D/BLOG_DEMO: Fragment:示例1A->onCreateView
09-04 21:43:08.040 7308-7308/cn.pigdreams.blogdemo D/BLOG_DEMO: Fragment:示例1A->onActivityCreated
09-04 21:43:08.041 7308-7308/cn.pigdreams.blogdemo D/BLOG_DEMO: Fragment:Title->onStart
    Fragment:示例1A->onStart
09-04 21:43:08.043 7308-7308/cn.pigdreams.blogdemo D/BLOG_DEMO: Activity:onStart
    Activity:onRestoreInstanceState
09-04 21:43:08.067 7308-7308/cn.pigdreams.blogdemo D/BLOG_DEMO: Activity:onResume
09-04 21:43:08.077 7308-7308/cn.pigdreams.blogdemo D/BLOG_DEMO: Fragment:Title->onResume
09-04 21:43:08.078 7308-7308/cn.pigdreams.blogdemo D/BLOG_DEMO: Fragment:示例1A->onResume
  • 這裡沒有設定任何config配置,可以看到橫豎屏切換生命週期方法執行都是一致的,先銷燬再建立
  • 生命週期變化相當於,按home回到主頁,被意外銷燬後重新建立的整個過程
  • 相比正常銷燬啟動多執行的方法是onSaveInstanceState與onRestoreInstanceState

這裡寫圖片描述