【Android】Activity与Fragment的生命周期的关系

小灰灰 2022-08-17 14:10 155阅读 0赞

一、问题描述:

假设有两个Activity(1和2),每个Activity拥有一个Fragment,并分别有一个Button,点击Button1可以start Activity2,然后点击Button2可以finish掉自己(即Activity2),然后返回到Activity1。根据这个简单模型描述一下Activity和Fragment的生命周期之间的依赖关系?

这里写图片描述


二、生命周期知识

Activity和Fragment的生命周期图谱可以参考我的另外一篇博客:【Android】Fragment的生命周期详解,他们的关系大致如下图:

这里写图片描述


三、代码验证

MainActivity和SecondActivity的布局是这样的,里面各添加了一个Fragment:

这里写图片描述 这里写图片描述

  1. /**
  2. * MainActivity布局xml文件
  3. */
  4. <?xml version="1.0" encoding="utf-8"?>
  5. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  6. android:orientation="vertical" android:layout_width="fill_parent"
  7. android:layout_height="fill_parent">
  8. <Button
  9. android:id="@+id/button"
  10. android:text="开启第二个Activity"
  11. android:layout_gravity="center"
  12. android:layout_width="wrap_content"
  13. android:layout_height="wrap_content"></Button>
  14. <LinearLayout
  15. android:id="@+id/linearlayout"
  16. android:layout_width="match_parent"
  17. android:layout_height="match_parent"
  18. android:orientation="vertical"
  19. android:background="#339999">
  20. </LinearLayout>
  21. </LinearLayout>
  22. /**
  23. * MainActivity.java代码,SecondActivity的代码与之类似,这里就不贴那么多了
  24. */
  25. public class MainActivity extends Activity {
  26. private static final String LOG_TAG = "MainActivity";
  27. private Button mButton;
  28. @Override
  29. public void onCreate(Bundle savedInstanceState) {
  30. super.onCreate(savedInstanceState);
  31. setContentView(R.layout.activity_main);
  32. Log.w(LOG_TAG, "==============onCreate()");
  33. FragmentManager fragmentManager = getFragmentManager();
  34. FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
  35. FirstFragment firstFragment = new FirstFragment();
  36. fragmentTransaction.add(R.id.linearlayout, firstFragment);
  37. fragmentTransaction.commit();
  38. mButton = (Button) findViewById(R.id.button);
  39. mButton.setOnClickListener(new View.OnClickListener() {
  40. @Override
  41. public void onClick(View v) {
  42. Log.w(LOG_TAG, "------------------mButton onClick-------------------");
  43. startActivity(new Intent(MainActivity.this, SecondActivity.class));
  44. }
  45. });
  46. }
  47. @Override
  48. protected void onStart() {
  49. super.onStart();
  50. Log.w(LOG_TAG, "==============onStart()");
  51. }
  52. @Override
  53. protected void onRestart() {
  54. super.onRestart();
  55. Log.w(LOG_TAG, "==============onRestart()");
  56. }
  57. @Override
  58. protected void onResume() {
  59. super.onResume();
  60. Log.w(LOG_TAG, "==============onResume()");
  61. }
  62. @Override
  63. protected void onPause() {
  64. super.onPause();
  65. Log.w(LOG_TAG, "==============onPause()");
  66. }
  67. @Override
  68. protected void onStop() {
  69. super.onStop();
  70. Log.w(LOG_TAG, "==============onStop()");
  71. }
  72. @Override
  73. protected void onDestroy() {
  74. super.onDestroy();
  75. Log.w(LOG_TAG, "==============onDestroy()");
  76. }
  77. }
  78. /**
  79. * FirstFragment.java代码, SecondFragment和它差不多一样
  80. */
  81. public class FirstFragment extends Fragment {
  82. private static final String LOG_TAG = "FirstFragment";
  83. private static final String ARG_PARAM1 = "param1";
  84. private static final String ARG_PARAM2 = "param2";
  85. private String mParam1;
  86. private String mParam2;
  87. public FirstFragment() {
  88. }
  89. @Override
  90. public void onAttach(Activity activity) {
  91. super.onAttach(activity);
  92. Log.w(LOG_TAG, "onAttach...");
  93. }
  94. @Override
  95. public void onCreate(Bundle savedInstanceState) {
  96. super.onCreate(savedInstanceState);
  97. Log.w(LOG_TAG, "onCreate...");
  98. if (getArguments() != null) {
  99. mParam1 = getArguments().getString(ARG_PARAM1);
  100. mParam2 = getArguments().getString(ARG_PARAM2);
  101. }
  102. }
  103. @Override
  104. public View onCreateView(LayoutInflater inflater, ViewGroup container,
  105. Bundle savedInstanceState) {
  106. Log.w(LOG_TAG, "onCreateView...");
  107. return inflater.inflate(R.layout.fragment_first, container, false);
  108. }
  109. @Override
  110. public void onActivityCreated(Bundle savedInstanceState) {
  111. super.onActivityCreated(savedInstanceState);
  112. Log.w(LOG_TAG, "onActivityCreated...");
  113. }
  114. @Override
  115. public void onStart() {
  116. super.onStart();
  117. Log.w(LOG_TAG, "onStart...");
  118. }
  119. @Override
  120. public void onResume() {
  121. super.onResume();
  122. Log.w(LOG_TAG, "onResume...");
  123. }
  124. @Override
  125. public void onPause() {
  126. super.onPause();
  127. Log.w(LOG_TAG, "onPause...");
  128. }
  129. @Override
  130. public void onStop() {
  131. super.onStop();
  132. Log.w(LOG_TAG, "onStop...");
  133. }
  134. @Override
  135. public void onDestroyView() {
  136. super.onDestroyView();
  137. Log.w(LOG_TAG, "onDestroyView...");
  138. }
  139. @Override
  140. public void onDestroy() {
  141. super.onDestroy();
  142. Log.w(LOG_TAG, "onDestroy...");
  143. }
  144. @Override
  145. public void onDetach() {
  146. super.onDetach();
  147. Log.w(LOG_TAG, "onDetach...");
  148. }
  149. }

四、运行结果

1、第一次打开以后:

  1. com.example.kuguan.anlearning W/MainActivity ==============onCreate()
  2. com.example.kuguan.anlearning W/FirstFragment onAttach...
  3. com.example.kuguan.anlearning W/FirstFragment onCreate...
  4. com.example.kuguan.anlearning W/FirstFragment onCreateView...
  5. com.example.kuguan.anlearning W/FirstFragment onActivityCreated...
  6. com.example.kuguan.anlearning W/MainActivity ==============onStart()
  7. com.example.kuguan.anlearning W/FirstFragment onStart...
  8. com.example.kuguan.anlearning W/MainActivity ==============onResume()
  9. com.example.kuguan.anlearning W/FirstFragment onResume...

2、点击MainActivity中的按钮“打开第二个Activity”以后:

  1. com.example.kuguan.anlearning W/MainActivity ----------------mButton onClick-----------------
  2. com.example.kuguan.anlearning W/FirstFragment onPause...
  3. com.example.kuguan.anlearning W/MainActivity ==============onPause()
  4. com.example.kuguan.anlearning W/SecondFragment onAttach...
  5. com.example.kuguan.anlearning W/SecondFragment onCreate...
  6. com.example.kuguan.anlearning W/SecondFragment onCreateView...
  7. com.example.kuguan.anlearning W/SecondFragment onActivityCreated...
  8. com.example.kuguan.anlearning W/SecondActivity ==============onStart()
  9. com.example.kuguan.anlearning W/SecondFragment onStart...
  10. com.example.kuguan.anlearning W/SecondActivity ==============onResume()
  11. com.example.kuguan.anlearning W/SecondFragment onResume...
  12. com.example.kuguan.anlearning W/FirstFragment onStop...
  13. com.example.kuguan.anlearning W/MainActivity ==============onStop()

3、点击SecondActivity的按钮“finish”之后:

  1. com.example.kuguan.anlearning W/SecondActivity -----------------mButton onClick------------------
  2. com.example.kuguan.anlearning W/SecondFragment onPause...
  3. com.example.kuguan.anlearning W/SecondActivity ==============onPause()
  4. com.example.kuguan.anlearning W/MainActivity ==============onRestart()
  5. com.example.kuguan.anlearning W/MainActivity ==============onStart()
  6. com.example.kuguan.anlearning W/FirstFragment onStart...
  7. com.example.kuguan.anlearning W/MainActivity ==============onResume()
  8. com.example.kuguan.anlearning W/FirstFragment onResume...
  9. com.example.kuguan.anlearning W/SecondFragment onStop...
  10. com.example.kuguan.anlearning W/SecondActivity ==============onStop()
  11. com.example.kuguan.anlearning W/SecondFragment onDestroyView...
  12. com.example.kuguan.anlearning W/SecondFragment onDestroy...
  13. com.example.kuguan.anlearning W/SecondFragment onDetach...
  14. com.example.kuguan.anlearning W/SecondActivity ==============onDestroy()

4、点击back键使MainActivity退到后台:

  1. com.example.kuguan.anlearning W/FirstFragment onPause...
  2. com.example.kuguan.anlearning W/MainActivity ==============onPause()
  3. com.example.kuguan.anlearning W/FirstFragment onStop...
  4. com.example.kuguan.anlearning W/MainActivity ==============onStop()
  5. com.example.kuguan.anlearning W/FirstFragment onDestroyView...
  6. com.example.kuguan.anlearning W/FirstFragment onDestroy...
  7. com.example.kuguan.anlearning W/FirstFragment onDetach...
  8. com.example.kuguan.anlearning W/MainActivity ==============onDestroy()

5、在MianActivity显示的时候,按HOME键:

  1. com.example.kuguan.anlearning W/FirstFragment onPause...
  2. com.example.kuguan.anlearning W/MainActivity ==============onPause()
  3. com.example.kuguan.anlearning W/FirstFragment onStop...
  4. com.example.kuguan.anlearning W/MainActivity ==============onStop()

6、然后再点击Icon打开:

  1. com.example.kuguan.anlearning W/MainActivity ==============onRestart()
  2. com.example.kuguan.anlearning W/MainActivity ==============onStart()
  3. com.example.kuguan.anlearning W/FirstFragment onStart...
  4. com.example.kuguan.anlearning W/MainActivity ==============onResume()
  5. com.example.kuguan.anlearning W/FirstFragment onResume...

【参考资料】:
1、Fragment和Activity

发表评论

表情:
评论列表 (有 0 条评论,155人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Fragment碎片生命周期

    一、碎片的生命周期 1、碎片和活动一样,也有四种状态,分别是:运行状态、暂停状态、停止状态和销毁状态。 2、活动有的回调方法,碎片中除了没有onRestart()的,其他的