Fragment生命週期

Fragment生命週期 — 圖 1 什麼是Fragment? Fragment片段(或稱為區塊)是Android提供的一個畫面區塊,可將Fragment放在一個Activity中
  • 最近在使用Fragment順便記錄一下 Fragment的生命週期

Fragment

Fragment不能獨立存在,必須嵌入到Activity中 Fragment具有自己的生命週期,接收它自己的事件,並可以在Activity運行時被增加或刪除 Fragment的生命週期直接受所在的Activity的影響。如:當Activity暫停時,它擁有的所有Fragment們都暫停 Fragment從 Android 3.0後引入 在低版本Android 3.0前使用 Fragment,需要採用android-support-v4.jar

生命週期

來看一下關方介紹的生命周期圖 每個Fragment擁有自己的生命週期,也就是說,在特定的狀況會自動呼叫特定的方法 供使用者依功能需求覆寫這些方法,加入必要的程式碼。依照Fragment產生與出現的順序會執行的方法描述如下

生命週期 — 圖 2

onAttach

當Fragment被加到某個Activity畫面中時,會自動呼叫此方法。

onCreate

Fragment被建立時會自動呼叫此方法,可加入初始化元件或資料的程式碼。

onCreateView

將在畫面中第一次顯示Fragment時會自動呼叫此方法,必須回傳Fragment畫面的View元件, 設計時,請使用方法中的LayoutInflater物件,在此方法中產生畫面元件並回傳。

onActivityCreated

當加入本Fragment的Activity被建立時,該Activity的onCreate方法執行完成後 會自動執行此方法。執行完此方法後,Fragment才出現在畫面上。

onStart

當Fragment出現在畫面中時先執行此方法。

onResume

執行完onStart方法後,再自動執行本方法。完成後即在畫面中與使用者互動。

暫停階段

當使用者按下返回鍵,或是程式中將Fragment自某個Activity中移除時,會自動執行以下方法:

onPause

進入暫停前第一個執行的方法。

onStop

執行完onPause方法後,自動執行本方法。

onDestroyView

此時Fragment已不在畫面中,呼叫此方法。

onDestroy

當Fragment要被清除之前,會執行此方法。

onDetach

與當初被加入的Activity卸載時,會自動執行此方法。

實作Fragment

  • 為了呈現效果 增加個底色

效果

效果 — 圖 3

MainActivity``` java

public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); FragmentManager fm = getSupportFragmentManager(); Fragment fragment = fm.findFragmentById(R.id.fragmentContainer); if (fragment == null) { fragment = new MainFragment(); fm.beginTransaction() .add(R.id.fragmentContainer, fragment) .commit(); } } }


### activity_main.xml``` java
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/fragmentContainer"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
</FrameLayout>

MainFragment``` java

public class MainFragment extends Fragment { public MainFragment() { // Required empty public constructor }

@Override
public void onCreate(Bundle savedInstanceState) {
    Logger.d("onCreate");
    super.onCreate(savedInstanceState);

}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    Logger.d("onCreateView");
    return inflater.inflate(R.layout.fragment_blank, container, false);
}
@Override
public void onStart() {
    Logger.v("onStart");
    super.onStart();
}
@Override
public void onResume() {
 Logger.d("onResume");
    super.onResume();
}
@Override
public void onPause() {
  Logger.d("onPause");
    super.onPause();
}
@Override
public void onStop() {
Logger.d("onStop");
    super.onStop();
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
Logger.d("onActivityCreated");
    super.onActivityCreated(savedInstanceState);
}
@Override
public void onDetach() {
 Logger.d("onDetach");
    super.onDetach();
}
@Override
public void onDestroy() {
  Logger.d("onDestroy");
    super.onDestroy();
}
@Override
public void onDestroyView() {
  Logger.d("onDestroyView");
    super.onDestroyView();
}
public void onAttach(Context context) {

Logger.d(“onAttach”); super.onAttach(context); } }


### fragment_blank.xml``` java

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.dustin.fragment.MainFragment">

    <!-- TODO: Update blank fragment layout -->
    <TextView
        android:id="@+id/textView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#321d"
        android:text="@string/hello_blank_fragment" />

</FrameLayout>

測試觀察生命週期

程式啟動

  • 執行專案後,MainActivity將Fragment加入畫面中 , 在系統中產生物件時,執行的順序如下
  • onAttac
  • onCreate
  • onCreateView
  • 取得View物件
  • 執行 onActivityCreated後
  • Fragment即顯示在畫面中
  • 之後執行onStart> onResume
程式啟動 — 圖 4 程式啟動 — 圖 5

按下HOME

  • 按下HOME鍵 執行的順序如下

    按下HOME — 圖 6
  • 與Activity的生命週期相同,先執行onPause,再執行onStop方法後,進入背景。

按下Recents

按下Recents — 圖 7
  • 回到程式後執行順序如下
  • onStart
  • onResume
按下Recents — 圖 8

按下返回鍵

  • 按下返回鍵 順序如下
  • onPause
  • onStop
  • 應用程式消失在畫面後
  • 執行onDestroyView
  • onDestroy
  • 最後執行onDetach
按下返回鍵 — 圖 9