2016-07-08 54 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)

相关问题