DustinChu Blog

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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

1
2
3
4
5
6
7
<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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<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

文章標題:Fragment生命週期

文章作者:Dustinchu

發布時間:2017年09月01日 - 01:09

最後更新:2017年09月26日 - 22:09

原始連結:https://dustinchu.github.io/2017/09/01/Fragment生命週期/

許可協議: 屬名-非商業性使用-禁止編譯 4.0 國際 轉載請保留原文連結及作者。

相關文章: