2

我想要更好地理解FragmentManager和FragmentTransactions以正確開發我的應用程序。特別是關於它們的生命週期以及提交FragmentTransaction(add)的長期效果。我對這個問題感到困惑的原因是當我運行一個示例活動,在帖子末尾列出。瞭解有關活動的FragmentManager和FragmentTransaction生命週期

我故意創建了一個名爲fragMan的靜態FragmentManager變量,並最初將其設置爲null。然後在onCreate()中檢查它是否爲null,並且在看到null值時,將fragMan變量設置爲getFragmentManager()返回值。在配置更改期間,Log.d顯示碎片不爲空,但之前添加的碎片「CameraFragment」在碎片中未找到,而fragman.isDestroyed()返回true。這對我來說意味着Activity.getFragmentManager()返回一個FragmentManager的新實例,並在fragMan老FragmentManager實例已經摧毀它的數據(?)

這裏就是混亂的用武之地。

1)「CameraFragment」如何在配置更改中的Activity上仍然關聯,並在 中找到FragmentManager的新實例?

2)當我點擊手機上的後退按鈕退出活動時,我使用應用程序菜單重新啓動樣本 活動。 CameraFragment不再可見,並且onCreate()檢查顯示fragMan仍然不爲null。我認爲點擊後退按鈕 稱爲默認的完成()命令,從內存中清除活動,並重新啓動它 將產生與樣本活動的初始啓動相同的結果?

謝謝你提供的任何和所有幫助!

public class MainActivity extends Activity 
{ 

static FragmentManager fragMan = null; 
FragmentTransaction fragTransaction; 

@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    if (fragMan != null) 
    { 

     Log.d("log", Boolean.toString(fragMan.isDestroyed())); 
        if(fragMan.findFragmentByTag("Camera Preview") == null) 
        { 
        Log.d("log", "Camera Preview not found."); 
        } 
    } 
    else 
    { 
     fragMan = getFragmentManager(); 
     fragTransaction = fragMan.beginTransaction(); 
     Fragment cameraFragment = new CameraFragment(); 
     ViewGroup root_view = (ViewGroup) findViewById(android.R.id.content); 
     fragTransaction.add(root_view.getId(), cameraFragment, "Camera Preview"); 
     fragTransaction.commit(); 

    } 

回答

3

Java中的靜態變量保留在Activity的創建/銷燬中 - 它們與類本身相關聯,但不是類的特定實例。

看到這裏的官方文檔: http://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html

當用戶返回到主屏幕,它只是被放在後臺狀態下您的應用程序並沒有結束。如果您強制停止應用程序並重新啓動它,那麼靜態FragmentManager將爲空。

關於CameraFragment,除非您設置了setRetainInstance(true),否則它將在方向更改中被銷燬。

====編輯

這裏發生了什麼的更詳細的流程...

  1. 您打開應用程序了首次
  2. 活動,例如說A1,被創建和其對應的FragmentManager實例FM1也被創建
  3. 將FM1存儲爲靜態變量
  4. 您將返回主頁
  5. 活動A1和FM1由於正常的活動生命週期而被破壞,儘管FM1的引用仍然由靜態變量保留。此時,FM1會丟失它所包含的所有片段,並且isDestroyed()將返回true。
  6. 再度開始
  7. 新活動實例A2被其新FragmentManager實例一起創建的應用程序FM2
+0

嘿唐, 感謝回答。我意識到靜態變量與應用程序進程的存在有關,而不是Activity(類)實例本身。關於主屏幕,我明白如果用戶點擊主頁按鈕,活動不會被破壞,但當我按下後退按鈕時,我在日誌中看到了「onStop()」命令。 主要問題是如何靜態fragmentManager(而不是一個CameraFragment實例)不爲空,但仍然返回到isDestroyed(),並找不到以前的CameraFragment混淆。 – blkhatpersian

+0

FragmentManager是一個靜態變量,正如您所指出的那樣,它與應用程序進程綁定在一起 - 這就是爲什麼當您返回到活動時它不爲空。 – don

+0

您編輯的答案與詳細的流程幫助了很多!我正在嘗試將一個片段動態地附加到一個活動中,並且現在知道如何做到最好。顯然,靜態fragmentManager只會浪費內存。謝謝唐 – blkhatpersian