2016-07-08 41 views
2

我正在構建具有以下結構的應用程序。從後臺恢復一個死的應用程序使其行爲異常

MainActivity -> Fragment1 
      -> Fragment2 -> Fragment3 

此處Fragment1託管在FrameLayout的MainActivity中。當用戶單擊Fragment1上的任何選項時,我將切換到在ViewPager上承載Fragment3的Fragment2。

問題是,如果用戶在未關閉應用程序的情況下移動到安卓主頁,並且持續一段時間該應用程序被Android終止,並且用戶嘗試從最近的應用程序列表恢復應用程序,則Fragment3顯示空白屏幕。

這裏是我使用的片段交易

public void requestChangeFragment(Fragment newFragment,String tag,Fragment oldFragment, int anim_in, int anim_out){ 
     if(isStopped()){ 
      return; 
     } 
     mFragmentManager = getSupportFragmentManager(); 
     android.support.v4.app.FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction(); 
     fragmentTransaction.setCustomAnimations(anim_in,anim_out,anim_in,anim_out); 
     fragmentTransaction.add(R.id.main_frame_layout, newFragment, tag); 
     Log.i("FragMngr","Animations set in "+anim_in+" out "+anim_out); 
     fragmentTransaction.addToBackStack(tag); 
     int count = mFragmentManager.getBackStackEntryCount(); 
     String log=""; 
     fragmentTransaction.commit(); 
     for(int i=0;i<count;i++){ 
      android.support.v4.app.FragmentManager.BackStackEntry backStackEntry = mFragmentManager.getBackStackEntryAt(i); 
      log += "count "+i+" name "+backStackEntry.getName()+"\n"; 
     } 
     Log.d("FragMngr","BackStack trace after adding is\n "+log); 
     if(oldFragment!=null) { 
      if(oldFragment.isResumed()) { 
       oldFragment.onPause(); 
      } 
     } 
     topFragment = newFragment; 
    } 

requestChangeFragment()從與interfaceMainActivity實施的幫助下運行片段調用的方法。

+0

您能否再張貼一些代碼plz。像onResume和onPause方法 – user6547359

+0

除了日誌以外,這些方法中基本沒有任何內容。即使我試圖在這些片段中使用Crashlytics,它也會崩潰。 (錯誤是,Crashlytics沒有初始化)如果我試圖初始化Crashlytics,它的顯示上下文不能爲空。 –

+0

您可能沒有很好地管理生命週期。這是一個很好的教程,如果你想閱讀它https://www.raywenderlich.com/117838/introduction-to-android-fragments-tutorial – user6547359

回答

0

做了一些研究之後,我發現問題是當應用程序未使用時,每當Android垃圾收集器殺死應用程序時,存儲碎片當前狀態的已保存實例。因此,當我嘗試恢復死了的應用程序時,它會在暫停應用程序之前移動選定的片段。但該片段沒有任何它必須從它的Main類中收到的數據。

解決方案:在onCreate方法中清除MainActivity中保存的實例。或者,如果您在保存的實例狀態中存儲了任何值,則執行與保存的實例狀態相關的操作,清除該值,然後致電super.onCreate(savedInstanceState)

相關問題