Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android—Fragment生命周期

Android—Fragment生命周期

編輯:關於Android編程

和活動一樣,Fragment也有生命周期。
官方文檔中有詳細的文字說明,不過最好還是實踐下,熟悉過程。
Android.com/guide/components/fragments.html">http://developer.Android.com/guide/components/fragments.html


1、Activity生命周期圖:
這裡寫圖片描述


2、Fragment生命周期圖:
這裡寫圖片描述


3、二者對比圖
這裡寫圖片描述
上圖(左邊:Activity,右邊:Fragment)可見:Activity和Fragment的生命周期回調方法一一對應。


4、碎片的狀態和回調
1. 運行狀態
當一個碎片是可見的,並且它所關聯的活動正處於運行狀態時,該碎片也處於運行狀態。
2. 暫停狀態
當一個活動進入暫停狀態時(由於另一個未占滿屏幕的活動被添加到了棧頂),與它相關聯的可見碎片就會進入到暫停狀態。
3. 停止狀態
當一個活動進入停止狀態時,與它相關聯的碎片就會進入到停止狀態。或者通過調用 FragmentTransaction 的 remove()、 replace()方法將碎片從活動中移除,但有在事務提交之前調用 addToBackStack()方法,這時的碎片也會進入到停止狀態。總的來說,進入停止狀態的碎片對用戶來說是完全不可見的,有可能會被系統回收。
4. 銷毀狀態
碎片總是依附於活動而存在的,因此當活動被銷毀時,與它相關聯的碎片就會進入到銷毀狀態。或者通過調用 FragmentTransaction 的remove()、 replace()方法將碎片從活動中移除,但在事務提交之前並沒有調用 addToBackStack()方法,這時的碎片也會進入到銷毀狀態。

Fragment 類中也提供了一系列的回調方法,以覆蓋碎片生命周期的每個環節。其中, 活動中有的回調方法,碎片中幾乎都有,不過碎片還提供了一些附加的回調方法,那我們就重點來看下這幾個回調。
1. onAttach()
當碎片和活動建立關聯的時候調用。
2. onCreateView()
為碎片創建視圖( 加載布局)時調用。
3. onActivityCreated()
確保與碎片相關聯的活動一定已經創建完畢的時候調用。
4. onDestroyView()
當與碎片關聯的視圖被移除的時候調用。
5. onDetach()
當碎片和活動解除關聯的時候調用。
6.onStop()
和activity一致,fragment不可見時調用, 可能情況:activity被stopped了 或者 fragment被移除加入到回退棧中,一個stopped的fragment仍然是活著的如果長時間不用也會被移除

5、體驗活動的生命周期

代碼:
創建一個Fragmentone布局:


創建一個fragmentTwo布局:



    

將FragmentOne加入主布局activity_main中:

import android.app.Fragment;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class FragmentOne extends Fragment {

    public static final String TAG = "FragmentOne";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG,"onCreate");
    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        Log.d(TAG,"onAttach");
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        Log.d(TAG,"onCreateView");
        View view = inflater.inflate(R.layout.fragment_one,container,false);
        return view;
    }


    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        Log.d(TAG,"onActivityCreated");
    }

    @Override
    public void onStart() {
        super.onStart();
        Log.d(TAG,"onStart");
    }

    @Override
    public void onResume() {
        super.onResume();
        Log.d(TAG,"onResume");
    }

    @Override
    public void onPause() {
        super.onPause();
        Log.d(TAG,"onPause");
    }

    @Override
    public void onStop() {
        super.onStop();
        Log.d(TAG,"onStop");
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        Log.d(TAG,"onDestroyView");
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.d(TAG,"onDestroy");
    }

    @Override
    public void onDetach() {
        super.onDetach();
        Log.d(TAG,"onDetach");
    }
}

創建fragmentTwo類繼承自Fragment類:

import android.app.Fragment;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

/**
 * Created by YQ950209 on 2016/10/15.
 */

public class fragmentTwo extends Fragment {

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_two,container,false);
        return view;
    }

}

主活動,通過button動態添加fragmentTwo:

package com.turo.fragmenttest;

import android.app.FragmentTransaction;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button = (Button) findViewById(R.id.btn);
        button.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.btn:
                fragmentTwo fragment = new fragmentTwo();
                android.app.FragmentManager fragmentManager = getFragmentManager();
                FragmentTransaction transaction = fragmentManager.beginTransaction();
                transaction.replace(R.id.two_layout,fragment);
                transaction.addToBackStack(null);
                transaction.commit();
                break;
            default:
                break;

        }
    }
}

運行程序,打印信息:
這裡寫圖片描述
當 FragmentOne 第一次被加載到屏幕上時,會依次執行 onAttach()、
onCreate()、 onCreateView()、 onActivityCreated()、 onStart()和 onResume()方法。

點擊button切換到FragmentTwo,不加addToBackStack()方法:
這裡寫圖片描述
可見,如果在替換的時候沒有調用 addToBackStack()方法,此時的 RightFragment 就會進入銷毀狀態, onDestroy()和onDetach()方法就會得到執行。

點擊button,加上addToBackStack()方法:
這裡寫圖片描述
addToBackStack,顧名思義就是加入返回棧的意思,這裡的意思就是我們在切換時會把FragmentOne加入到返回棧,此時的FragmentOne處於停止狀態,不至於銷毀。

點擊back鍵返回FragmentOne:
這裡寫圖片描述
由於FragmentOne重新回到了運行狀態,因此 onActivityCreated()、onStart()和 onResume()方法會得到執行。注意此時 onCreate()和 onCreateView()方法並不會執行,因為我們借助了addToBackStack()方法使得 FragmentOne 和它的視圖並沒有銷毀。

再次點擊back鍵退出程序:
這裡寫圖片描述
沒什麼好說的,退出程序依次會執行 onPause()、onStop()、onDestroyView()、 onDestroy()和 onDetach()方法,最終將活動和碎片一起銷毀。看到這裡不知大家是否對Fragment生命周期有更深刻的理解,如果還是模糊,強烈建議結合圖三——Activity和Fragment生命周期對比圖,再次閱讀!

寫在後面


樓主是一個應屆畢業生,不是什麼大牛,寫博客只是為了鞏固自己所學的基礎,不喜勿噴,如若有錯誤,歡迎各位讀者指出,萬分感謝!

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved