2016-02-25 58 views
2

我有一個問題,當我暫停我的應用程序幾分鐘(讓它停留在後臺),當我將它帶回到前臺時,我希望它始終返回到特定活動。現在,如果我在一個叫做Fragment A的特定片段上,並且我想導航到我的HomeActivity,我認爲從Fragment A撥打IntentonResume會起作用,因爲每當我認爲每當我從後臺恢復活動幾分鐘後,我的意圖會觸發並帶我回到HomeActivity。這是我的嘗試:如何在應用程序在後臺後導航回特定的活動?

FragmentA.java:

@Override 
    public void onResume(){ 
     super.onResume(); 
     Intent intent = new Intent(getActivity(), HomeActivity.class); 
     if(intent != null) { 
      startActivity(intent); 
     } 
    } 

現在,它好像當我加載了我的應用程序,出來的背景,當我的片段被調用,而不是「家」我希望它在我的應用程序從後臺進入前臺後調用的屏幕。順便說一句,在我的Android清單的HomeActivity不具備以下條件:

 <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 

由於這是我的登錄活動時,應用程序第一次啓動時。

但是,這似乎給我的應用程序一個白色的屏幕,沒有我的UI顯示,並最終崩潰我的應用程序。有什麼辦法可以隨時導航回到我在任何片段中的活動,當應用程序在後臺進入前臺(暫停,如果您願意)幾分鐘後進入前臺?任何幫助,將不勝感激。謝謝!

+0

@FabinPaul是的,但我只是想知道你爲什麼問這個,我不明白爲什麼orientationn會影響什麼...但我可能是錯的!不過,我可能會決定限制未來的方向變化。 – user1871869

+0

從我的理解,onSaveInstanceState是在應用程序在後臺銷燬之前調用的。當用戶返回應用程序時,會調用活動的/片段的onCreate。在onSaveInstanceState期間保存的捆綁包作爲參數提供給onCreate,當使用intent創建活動時,該參數爲null。 (在定向更改期間重新創建活動時除外)。所以根據onCreate param(bundle)的價值,你可以開始在家活動 –

+0

如果你打算限制方向的變化,我可能會給你一個解決方案。 –

回答

0

當應用程序進入背景,活性/片段savedStateInstance被調用並outState束被保存。

當應用程序恢復時,調用活動/片段onCreate(Bundle savedInstanceState)。在這種情況下,savedInstanceState不爲空。如果活動是使用意向開始的,則savedInstanceState將爲空。這就是爲什麼即使應用程序在後臺被銷燬,當應用程序恢復時,edittext將包含先前輸入的文本。 (活動/片段在被銷燬之前保存其UI狀態,以便在用戶返回時恢復UI)。

在你的片段,

@Override 
public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
if (savedInstanceState != null)  { 
     Intent intent = new Intent(getActivity(), HomeActivity.class); 
     startActivity(intent); 
} 
} 

當應用程序在後臺被破壞應該開始HomeActivity。

更新 您可以在您的活動中應用相同的邏輯,而不是在每個片段中重複它。即

@Override 
protected void onCreate(Bundle savedInstanceState) { 
if (savedInstanceState != null)  { 
     Intent intent = new Intent(this, HomeActivity.class); 
     startActivity(intent); 
} 
} 

注:你必須知道,在方位的變化,創建活動時,savedInstanceState不爲空。所以這個解決方案只適用於方向鎖定的情況。

希望它可以幫助..

+0

嗨,我試過你的方法,但不幸的是它似乎不工作。我將上面的代碼放在'onCreateView(LayoutInflater inflater,ViewGroup容器,Bundle savedInstanceState)'而不是'onCreate'方法中,因爲這就是我的片段的創建方式。我有一個打印語句,就在似乎要打印的'startActivity(intent)'之前。然而,在我的'HomeActivity.class'的'onCreate'方法中,我在我的類的'onCreate'方法中有一個print語句,並且看起來沒有打印。這有什麼理由不會發生? – user1871869

+0

我不確定這個解決方案是否真的有效。問題是,如果我在我的片段之間切換,並且在每個片段中都有上面的代碼,我會經常回到「HomeActivity」。 – user1871869

+0

嘗試將代碼移動到'onCreate'而不是'onCreatView' –

0

如果您使用的片段使用堆棧中

String backStateName = fragment.getClass().getName(); 
     FragmentManager manager = getSupportFragmentManager(); 
     boolean fragmentPopped = manager.popBackStackImmediate(backStateName, 0); 
     if (!fragmentPopped) { //fragment not in back stack, create it. 
      FragmentTransaction ft = manager.beginTransaction(); 
      ft.replace(R.id.container_body, fragment); 
      ft.addToBackStack(backStateName); 
      ft.commit(); 

     } 

使用此下面的代碼,無論你想刪除現有fragmets。

if (getSupportFragmentManager().getBackStackEntryCount() > 0) { 
     getFragmentManager().popBackStack();  
} 
+0

我在哪裏可以使用它?在片段的'onResume'方法中? – user1871869

+0

是的,你可以在onResume中使用這個,也可以在onDetach – MathaN

相關問題