Android 从后台恢复一个死掉的应用程序会使其行为怪异

Android 从后台恢复一个死掉的应用程序会使其行为怪异,android,android-fragments,transactionmanager,Android,Android Fragments,Transactionmanager,我正在构建一个具有以下结构的应用程序 MainActivity -> Fragment1 -> Fragment2 -> Fragment3 此处Fragment1位于FrameLayout中的MainActivity上。当用户单击Fragment1上的任何选项时,我切换到Fragment2,它在ViewPager上托管Fragment3 问题是,如果用户在不关闭应用程序的情况下移动到Android家庭,并且在一段时间内,应用程序被Android杀死

我正在构建一个具有以下结构的应用程序

MainActivity -> Fragment1
             -> Fragment2 -> Fragment3
此处Fragment1位于FrameLayout中的MainActivity上。当用户单击Fragment1上的任何选项时,我切换到Fragment2,它在ViewPager上托管Fragment3

问题是,如果用户在不关闭应用程序的情况下移动到Android家庭,并且在一段时间内,应用程序被Android杀死,用户试图从最近的应用程序列表恢复应用程序,片段3显示空白屏幕。 下面是我用于片段事务的方法

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;
    }
public void requestChangeFragment(Fragment newFragment、String标记、Fragment oldFragment、int anim_in、int anim_out){
if(isStopped()){
返回;
}
MFFragmentManager=getSupportFragmentManager();
android.support.v4.app.FragmentTransaction FragmentTransaction=MFFragmentManager.beginTransaction();
fragmentTransaction.setCustomAnimations(动画输入、动画输出、动画输入、动画输出);
fragmentTransaction.add(R.id.main\u frame\u布局、newFragment、标记);
Log.i(“FragMngr”,“动画设置在”+动画输入+“输出”+动画输出);
fragmentTransaction.addToBackStack(标记);
int count=mffragmentmanager.getBackStackEntryCount();
字符串log=“”;
fragmentTransaction.commit();

对于(int i=0;i在做了一些研究之后,我发现问题在于保存的实例,每当android垃圾收集器在应用程序未使用时杀死应用程序时,这些实例都会存储片段的当前状态。因此,当我尝试恢复死了的应用程序时,它会移动在暂停应用程序之前选择的片段。但是片段没有任何da它必须从it主类收到的ta


解决方案:在onCreate方法中清除MainActivity中保存的实例。或者,如果要在保存的实例状态中存储任何值,则执行与保存的实例状态相关的操作,清除该值,然后调用
super.onCreate(savedInstanceState)

在做了一些研究之后,我发现问题在于保存的实例,当android垃圾收集器在应用程序未使用时杀死应用程序时,这些实例会存储片段的当前状态。因此,当我尝试恢复已死亡的应用程序时,它会移动在暂停应用程序之前选择的片段。但是片段没有任何d它必须从it主类接收的ata


解决方案:在onCreate方法中清除MainActivity中保存的实例。或者,如果要在保存的实例状态中存储任何值,则执行与保存的实例状态相关的操作,清除该值,然后调用
super.onCreate(savedInstanceState)

你能再发布一些代码吗?比如onResume和onPause方法,除了日志,这些方法基本上什么都没有。即使我试图在这些片段中使用Crashlytics,它也会崩溃。(错误是,Crashlytics没有初始化)如果我试图初始化Crashlytics,它的显示上下文不能为null。你可能没有很好地管理生命周期。如果你想了解它,这里有一个很好的教程。我正在尽可能地处理生命周期,但是当用户在没有关闭应用程序的情况下进入android home,并且应用程序进程被和终止时,问题就会出现roid垃圾收集器。永远不要调用
活动
片段
的生命周期回调(
onPause()
等)。系统将自行处理。您能再发布一些代码吗?例如onResume和onPause方法。这些方法中除了日志外基本上什么都没有。即使我试图在这些片段中使用Crashlytics,它也会崩溃。(错误是,Crashlytics未初始化)如果我试图初始化Crashlytics,它的显示上下文不能为null。你可能没有很好地管理生命周期。如果你想了解它,这里有一个很好的教程。我正在尽可能地处理生命周期,但是当用户在没有关闭应用程序的情况下进入android home,并且应用程序进程被和终止时,问题就会出现roid垃圾收集器。永远不要调用
活动
片段
的生命周期回调(
onPause()
等)。系统将自行处理。