Fragment生命周期詳解

来源:https://www.cnblogs.com/toly/archive/2018/03/30/8678071.html
-Advertisement-
Play Games

Fragment依附Activity而存在,本文通過兩個TextView切換兩個Fragment來觀察Activity和兩個Fragment在不同操作下各執行哪些方法,從而對其生命周期有更加深刻的瞭解。通過列印log進行分析。 ...


Fragment依附Activity而存在,本文通過兩個TextView切換兩個Fragment來觀察Activity和兩個Fragment在不同操作下各執行哪些方法,從而對其生命周期有更加深刻的瞭解。通過列印log進行分析。

  • 本文要點:
  1. Fragment的動態載入,和切換。
  2. Fragment和Activity的生命周期分析。
  • 註:文中:
  1. 使用ButterKnife,免去findViewById。
  2. LogUtils.e()為個人工具類,可等視為log.e()
  • 進入LifeActivity時,Fragment1顯示:
  1. 先執行LifeActivity onCreate方法,再執行Fragment1onAttachonAttach、onCreateView、onActivityCreated方法。
  2. LifeActivity、Fragment1 onStart方法 到 LifeActivity、Fragment1 onResume方法 可見在初始化時Activity要優先Fragment一步。

 

03-29 23:09:43.827 14564-14564/top.toly.www.fragment E/LifeActivity: onCreate: ====LifeActivity
03-29 23:09:43.831 14564-14564/top.toly.www.fragment E/Fragment1: onAttach: ====Fragment1
03-29 23:09:43.831 14564-14564/top.toly.www.fragment E/Fragment1: onCreate: ====Fragment1
03-29 23:09:43.831 14564-14564/top.toly.www.fragment E/Fragment1: onCreateView:====Fragment1 
03-29 23:09:43.832 14564-14564/top.toly.www.fragment E/Fragment1: onActivityCreated:====Fragment1 
03-29 23:09:43.832 14564-14564/top.toly.www.fragment E/LifeActivity: onStart: ====LifeActivity
03-29 23:09:43.832 14564-14564/top.toly.www.fragment E/Fragment1: onStart: ====Fragment1
03-29 23:09:43.832 14564-14564/top.toly.www.fragment E/LifeActivity: onResume: ====LifeActivity
03-29 23:09:43.832 14564-14564/top.toly.www.fragment E/Fragment1: onResume:====Fragment1 

  • 將屏幕關閉時:Fragment1LifeActivity分別執行onPauseonStop方法。 可見在暫停時Fragment要優先Activity一步。
03-29 23:17:12.928 19745-19745/top.toly.www.fragment E/Fragment1: onPause:====Fragment1
03-29 23:17:12.928 19745-19745/top.toly.www.fragment E/LifeActivity: onPause: ====LifeActivity
03-29 23:17:12.960 19745-19745/top.toly.www.fragment E/Fragment1: onStop: ====Fragment1
03-29 23:17:12.960 19745-19745/top.toly.www.fragment E/LifeActivity: onStop: ====LifeActivity

  • 將屏幕打開時:LifeActivityonRestartLifeActivityFragment1onStart。LifeActivityFragment1onResume
03-29 23:17:59.144 19745-19745/top.toly.www.fragment E/LifeActivity: onRestart: ====LifeActivity
03-29 23:17:59.153 19745-19745/top.toly.www.fragment E/LifeActivity: onStart: ====LifeActivity
03-29 23:17:59.153 19745-19745/top.toly.www.fragment E/Fragment1: onStart: ====Fragment1
03-29 23:17:59.154 19745-19745/top.toly.www.fragment E/LifeActivity: onResume: ====LifeActivity
03-29 23:17:59.154 19745-19745/top.toly.www.fragment E/Fragment1: onResume:====Fragment1

  • Fragment1切到Fragment2時:
03-29 23:20:49.003 22825-22825/top.toly.www.fragment E/Fragment1: onPause:====Fragment1 
03-29 23:20:49.005 22825-22825/top.toly.www.fragment E/Fragment1: onStop: ====Fragment1
03-29 23:20:49.005 22825-22825/top.toly.www.fragment E/Fragment1: onDestroyView: ====Fragment1
03-29 23:20:49.005 22825-22825/top.toly.www.fragment E/Fragment1: onDestroy:====Fragment1 
03-29 23:20:49.006 22825-22825/top.toly.www.fragment E/Fragment1: onDetach:====Fragment1 
03-29 23:20:49.006 22825-22825/top.toly.www.fragment E/Fragment2: onAttach: ====Fragment2
03-29 23:20:49.006 22825-22825/top.toly.www.fragment E/Fragment2: onCreate: ====Fragment2
03-29 23:20:49.006 22825-22825/top.toly.www.fragment E/Fragment2: onCreateView:====Fragment2 
03-29 23:20:49.035 22825-22825/top.toly.www.fragment E/Fragment2: onActivityCreated:====Fragment2 
03-29 23:20:49.035 22825-22825/top.toly.www.fragment E/Fragment2: onStart: ====Fragment2
03-29 23:20:49.035 22825-22825/top.toly.www.fragment E/Fragment2: onResume:====Fragment2 

  • Fragment2切到Fragment1時:

 

03-29 23:22:18.835 22825-22825/top.toly.www.fragment E/Fragment2: onPause:====Fragment2 
03-29 23:22:18.835 22825-22825/top.toly.www.fragment E/Fragment2: onStop: ====Fragment2
03-29 23:22:18.835 22825-22825/top.toly.www.fragment E/Fragment2: onDestroyView: ====Fragment2
03-29 23:22:18.836 22825-22825/top.toly.www.fragment E/Fragment2: onDestroy:====Fragment2 
03-29 23:22:18.836 22825-22825/top.toly.www.fragment E/Fragment2: onDetach:====Fragment2 
03-29 23:22:18.837 22825-22825/top.toly.www.fragment E/Fragment1: onAttach: ====Fragment1
03-29 23:22:18.837 22825-22825/top.toly.www.fragment E/Fragment1: onCreate: ====Fragment1
03-29 23:22:18.837 22825-22825/top.toly.www.fragment E/Fragment1: onCreateView:====Fragment1 
03-29 23:22:18.840 22825-22825/top.toly.www.fragment E/Fragment1: onActivityCreated:====Fragment1 
03-29 23:22:18.840 22825-22825/top.toly.www.fragment E/Fragment1: onStart: ====Fragment1
03-29 23:22:18.840 22825-22825/top.toly.www.fragment E/Fragment1: onResume:====Fragment1 

 


  • 退出LifeActivity時:
03-29 23:11:47.792 14564-14564/top.toly.www.fragment E/Fragment1: onPause:====Fragment1 
03-29 23:11:47.792 14564-14564/top.toly.www.fragment E/LifeActivity: onPause: ====LifeActivity
03-29 23:11:47.798 14564-14564/top.toly.www.fragment E/Fragment1: onStop: ====Fragment1
03-29 23:11:47.798 14564-14564/top.toly.www.fragment E/LifeActivity: onStop: ====LifeActivity
03-29 23:11:47.798 14564-14564/top.toly.www.fragment E/Fragment1: onDestroyView: ====Fragment1
03-29 23:11:47.799 14564-14564/top.toly.www.fragment E/Fragment1: onDestroy:====Fragment1 
03-29 23:11:47.799 14564-14564/top.toly.www.fragment E/Fragment1: onDetach:====Fragment1 
03-29 23:11:47.799 14564-14564/top.toly.www.fragment E/LifeActivity: onDestroy: ====LifeActivity
  • 下麵是具體代碼。(源碼地址:https://github.com/toly1994328/Fragment.git)

 

 

 

LifeActivity.java

 

 1 package top.toly.www.fragment.life;
 2 
 3 import android.app.FragmentManager;
 4 import android.app.FragmentTransaction;
 5 import android.os.Bundle;
 6 import android.support.v7.app.AppCompatActivity;
 7 import android.view.View;
 8 import android.widget.FrameLayout;
 9 import android.widget.TextView;
10 
11 import butterknife.Bind;
12 import butterknife.ButterKnife;
13 import butterknife.OnClick;
14 import top.toly.www.fragment.R;
15 import utils.shortUtils.LogUtils;
16 
17 public class LifeActivity extends AppCompatActivity {
18     private static final String TAG = "LifeActivity";
19 
20     @Bind(R.id.tv_title1)
21     TextView mTvTitle1;
22     @Bind(R.id.tv_title2)
23     TextView mTvTitle2;
24     @Bind(R.id.fl_life_root)
25     FrameLayout mFlLifeRoot;
26     private FragmentManager mFm;
27     private FragmentTransaction mFt;
28 
29     @Override
30     protected void onCreate(Bundle savedInstanceState) {
31         super.onCreate(savedInstanceState);
32         setContentView(R.layout.activity_life);
33         LogUtils.e(TAG, "onCreate: ====LifeActivity");
34         ButterKnife.bind(this);
35         initFragment();//初始Fragment
36     }
37 
38     @Override
39     protected void onStart() {
40         super.onStart();
41         LogUtils.e(TAG, "onStart: ====LifeActivity");
42     }
43 
44     @Override
45     protected void onResume() {
46         super.onResume();
47         LogUtils.e(TAG, "onResume: ====LifeActivity");
48     }
49 
50     @Override
51     protected void onPause() {
52         super.onPause();
53         LogUtils.e(TAG, "onPause: ====LifeActivity");
54     }
55 
56     @Override
57     protected void onStop() {
58         super.onStop();
59         LogUtils.e(TAG, "onStop: ====LifeActivity");
60     }
61 
62     @Override
63     protected void onRestart() {
64         super.onRestart();
65         LogUtils.e(TAG, "onRestart: ====LifeActivity");
66     }
67     @Override
68     protected void onDestroy() {
69         super.onDestroy();
70         LogUtils.e(TAG, "onDestroy: ====LifeActivity");
71     }
72 
73     private void initFragment() {
74         mFm = getFragmentManager();//1.獲取FragmentManager
75         mFt = mFm.beginTransaction();//2.fm開啟事務
76         mFt.add(R.id.fl_life_root, new Fragment1()); //3.動態添加
77         mFt.commit();//4.提交事務
78     }
79 
80     @OnClick({R.id.tv_title1, R.id.tv_title2})
81     public void onViewClicked(View view) {
82         mFt = mFm.beginTransaction();//2.fm開啟事務
83         switch (view.getId()) {
84             case R.id.tv_title1:
85                 mFlLifeRoot.removeAllViews();//先清屏
86                 mFt.replace(R.id.fl_life_root, new Fragment1()); //3.動態添加
87                 break;
88             case R.id.tv_title2:
89                 mFlLifeRoot.removeAllViews();//先清屏
90                 mFt.replace(R.id.fl_life_root, new Fragment2()); //3.動態添加
91                 break;
92         }
93         mFt.commit();//4.提交事務
94     }
95 }

Fragment1.java

 1 package top.toly.www.fragment.life;
 2 
 3 
 4 import android.app.Fragment;
 5 import android.content.Context;
 6 import android.os.Bundle;
 7 import android.view.LayoutInflater;
 8 import android.view.View;
 9 import android.view.ViewGroup;
10 
11 import top.toly.www.fragment.R;
12 import utils.shortUtils.LogUtils;
13 
14 /**
15  * A simple {@link Fragment} subclass.
16  */
17 public class Fragment1 extends Fragment {
18     private static final String TAG = "Fragment1";
19 
20     public Fragment1() {
21         // Required empty public constructor
22     }
23 
24     @Override
25     public void onAttach(Context context) {
26         super.onAttach(context);
27         LogUtils.e(TAG, "onAttach: ====Fragment1");
28     }
29 
30     @Override
31     public void onCreate(Bundle savedInstanceState) {
32         super.onCreate(savedInstanceState);
33         LogUtils.e(TAG, "onCreate: ====Fragment1");
34     }
35 
36     @Override
37     public View onCreateView(LayoutInflater inflater, ViewGroup container,
38                              Bundle savedInstanceState) {
39         LogUtils.e(TAG, "onCreateView:====Fragment1 ");
40         return inflater.inflate(R.layout.fragment_fragment1, container, false);
41     }
42 
43     @Override
44     public void onActivityCreated(Bundle savedInstanceState) {
45         super.onActivityCreated(savedInstanceState);
46         LogUtils.e(TAG, "onActivityCreated:====Fragment1 ");
47     }
48 
49     @Override
50     public void onStart() {
51         super.onStart();
52         LogUtils.e(TAG, "onStart: ====Fragment1");
53     }
54 
55     @Override
56     public void onResume() {
57         super.onResume();
58         LogUtils.e(TAG, "onResume:====Fragment1 ");
59     }
60 
61     @Override
62     public void onPause() {
63         super.onPause();
64         LogUtils.e(TAG, "onPause:====Fragment1 ");
65     }
66 
67     @Override
68     public void onStop() {
69         super.onStop();
70         LogUtils.e(TAG, "onStop: ====Fragment1");
71     }
72 
73     @Override
74     public void onDestroyView() {
75         super.onDestroyView();
76         LogUtils.e(TAG, "onDestroyView: ====Fragment1");
77     }
78 
79     @Override
80     public void onDestroy() {
81         super.onDestroy();
82         LogUtils.e(TAG, "onDestroy:====Fragment1 ");
83     }
84 
85     @Override
86     public void onDetach() {
87         super.onDetach();
88         LogUtils.e(TAG, "onDetach:====Fragment1 ");
89     }
90 }

Fragment2.java

 1 package top.toly.www.fragment.life;
 2 
 3 
 4 import android.app.Fragment;
 5 import android.content.Context;
 6 import android.os.Bundle;
 7 import android.view.LayoutInflater;
 8 import android.view.View;
 9 import android.view.ViewGroup;
10 
11 import top.toly.www.fragment.R;
12 import utils.shortUtils.LogUtils;
13 
14 /**
15  * A simple {@link Fragment} subclass.
16  */
17 public class Fragment2 extends Fragment {
18     private static final String TAG = "Fragment2";
19 
20     public Fragment2() {
21         // Required empty public constructor
22     }
23 
24     @Override
25     public void onAttach(Context context) {
26         super.onAttach(context);
27         LogUtils.e(TAG, "onAttach: ====Fragment2");
28     }
29 
30     @Override
31     public void onCreate(Bundle savedInstanceState) {
32         super.onCreate(savedInstanceState);
33         LogUtils.e(TAG, "onCreate: ====Fragment2");
34     }
35 
36     @Override
37     public View onCreateView(LayoutInflater inflater, ViewGroup container,
38                              Bundle savedInstanceState) {
39         LogUtils.e(TAG, "onCreateView:====Fragment2 ");
40         return inflater.inflate(R.layout.fragment_fragment2, container, false);
41     }
42 
43     @Override
44     public void onActivityCreated(Bundle savedInstanceState) {
45         super.onActivityCreated(savedInstanceState);
46         LogUtils.e(TAG, "onActivityCreated:====Fragment2 ");
47     }
48 
49     @Override
50     public void onStart() {
51         super.onStart();
52         LogUtils.e(TAG, "onStart: ====Fragment2");
53     }
54 
55     @Override
56     public void onResume() {
57         super.onResume();
58         LogUtils.e(TAG, "onResume:====Fragment2 ");
59     }
60 
61     @Override
62     public void onPause() {
63         super.onPause();
64         LogUtils.e(TAG, "onPause:====Fragment2 ");
65     }
66 
67     @Override
68     public void onStop() {
69         super.onStop();
70         LogUtils.e(TAG, "onStop: ====Fragment2");
71     }
72 
73     @Override
74     public void onDestroyView() {
75         super.onDestroyView();
76         LogUtils.e(TAG, "onDestroyView: ====Fragment2");
77     }
78 
79     @Override
80     public void onDestroy() {
81         super.onDestroy();
82         LogUtils.e(TAG, "onDestroy:====Fragment2 ");
83     }
84 
85     @Override
86     public void onDetach() {
87         super.onDetach();
88         LogUtils.e(TAG, "onDetach:====Fragment2 ");
89     }
90 }

LifeActivity的佈局文件:activity_life.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="top.toly.www.fragment.life.LifeActivity">
<LinearLayout
    android:id="@+id/ll_life_root"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:orientation="horizontal">
    <TextView
        android:id="@+id/tv_title1"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:text="title1"
        android:gravity="center"/>
    <TextView
        android:id="@+id/tv_title2"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:text="title2"
        android:gravity="center"/>
</LinearLayout>
    <FrameLayout
        android:id="@+id/fl_life_root"
        android:layout_below="@+id/ll_life_root"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </FrameLayout>
</RelativeLayout>

Fragment1使用的佈局文件:fragment_fragment1.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
             xmlns:tools="http://schemas.android.com/tools"
             android:layout_width="match_parent"
             android:layout_height="match_parent"
             tools:context="top.toly.www.fragment.life.Fragment1">

    <!-- TODO: Update blank fragment layout -->
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:gravity="center"
        android:textSize="24sp"
        android:text="@string/fragment1"/>
</RelativeLayout>

Fragment2使用的佈局文件:fragment_fragment2.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
             xmlns:tools="http://schemas.android.com/tools"
             android:layout_width="match_parent"
             android:layout_height="match_parent"
             tools:context="top.toly.www.fragment.life.Fragment1">

    <!-- TODO: Update blank fragment layout -->
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:gravity="center"
        android:textSize="24sp"
        android:text="@string/fragment2"/>

</RelativeLayout>

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 10053事件:Event 10053 is an internal event that externalises some of the decisions made by the optimizer in to a trace file. 對於10053更多的介紹,這裡不再重覆 註:使用100 ...
  • HDFS Federation HDFS Federation. 1 1 Background. 1 2.多個namenode/namespace. 1 2.1 關鍵好處... 1 3 聯合配置... 1 3.1 配置... 1 3.2 格式化namenode. 1 3.3 更新老的release並 ...
  • 生活不止眼前的苟且,還有詩和遠方。 請根據給出的資料庫表結構來回答相應問題: DEPT (DEPTNO INT, DNAME VARCHAR(14),LOC VARCHAR(13)); EMP (EMPNO INT,ENAME VARCHAR(10), JOB VARCHAR(9), MGR INT ...
  • 寫在開篇: 這個mysql得配置文件my.cnf,是我現在環境里常用得,包含基礎配置及一些優化,本來一直在我得有道筆記里記錄著,之前一直沒有寫博客的習慣,最近剛開始註冊博客,就將這些東西貼出來,供需要得朋友拿來使用及學習。 [client]port=3306socket =/data/mysqlda ...
  • HBase完全分散式集群搭建 hbase和hadoop一樣也分為單機版,偽分散式版和完全分散式集群版,此文介紹如何搭建完全分散式集群環境搭建。hbase依賴於hadoop環境,搭建habase之前首先需要搭建好hadoop的完全集群環境。本文中採用獨立的zookeeper,不使用hbase自帶的zo ...
  • 1.兩種方式 1.1:row_number() over()函數 1.2:OFFSET ....FETCH OFFSET { integer_constant | offset_row_count_expression } { ROW | ROWS } 指定在從查詢表達式中開始返回行之前,將跳過的行 ...
  • 目前未在生產環境中升級過資料庫版本,倒是在測試環境跟開發環境升級過。 可以通過mysqldump sql文件進行升級,也可以通過mysql_upgrade升級,前者耗時較長,且需要足夠量的磁碟空間,本文暫不討論,升級使用mysql_upgrade方式。 如果轉載,請註明博文來源: www.cnblo ...
  • 做了一個如下的小廁所,如果我需要得到返回是 d,f 那我需要用那組語句呢? A: B: C: 實際情況執行一下就知道,其實BC 的語句都可以執行。而A的執行情況就是只返回了 d。這個其實是跟select 的執行順序有關的。 通常我們看select 的執行順序的時候,可能會忽略這2個不常用的連接謂詞導 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...