Fragment生命週期
什麼是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產生與出現的順序會執行的方法描述如下
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
- 為了呈現效果 增加個底色
效果
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
按下HOME
-
按下HOME鍵 執行的順序如下
-
與Activity的生命週期相同,先執行onPause,再執行onStop方法後,進入背景。
按下Recents
- 回到程式後執行順序如下
- onStart
- onResume
按下返回鍵
- 按下返回鍵 順序如下
- onPause
- onStop
- 應用程式消失在畫面後
- 執行onDestroyView
- onDestroy
- 最後執行onDetach