从后台恢复死掉的应用程序会使其行为异常
Resuming a dead app from background is making it behave weirdly
我正在构建一个具有以下结构的应用程序。
MainActivity -> Fragment1
-> Fragment2 -> Fragment3
此处 Fragment1 托管在 FrameLayout 中的 MainActivity 上。当用户单击 Fragment1 上的任何选项时,我将切换到在 ViewPager 上托管 Fragment3 的 Fragment2。
问题是,如果用户在没有关闭应用的情况下移动到 android 主页,并且在一段时间内应用被 Android 杀死,并且用户尝试从最近的应用恢复应用列表,Fragment3 显示空白屏幕。
这里是我用于Fragment交易的方法
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()
是在 MainActivity
中实现的 interface
的帮助下从 运行 片段调用的。
经过一些研究后,我发现问题出在保存的实例上,每当 android 垃圾收集器在不使用应用程序时杀死应用程序时,它就会存储片段的当前状态。因此,当我尝试恢复死掉的应用程序时,它会移动暂停应用程序之前选择的片段。但是该片段没有任何它必须从 it Main class.
接收到的数据
解决方案:在 onCreate 方法中清除 MainActivity 中保存的实例。或者,如果您在保存的实例状态中存储任何值,则执行与保存的实例状态相关的操作,清除该值,然后调用 super.onCreate(savedInstanceState)
我正在构建一个具有以下结构的应用程序。
MainActivity -> Fragment1
-> Fragment2 -> Fragment3
此处 Fragment1 托管在 FrameLayout 中的 MainActivity 上。当用户单击 Fragment1 上的任何选项时,我将切换到在 ViewPager 上托管 Fragment3 的 Fragment2。
问题是,如果用户在没有关闭应用的情况下移动到 android 主页,并且在一段时间内应用被 Android 杀死,并且用户尝试从最近的应用恢复应用列表,Fragment3 显示空白屏幕。
这里是我用于Fragment交易的方法
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()
是在 MainActivity
中实现的 interface
的帮助下从 运行 片段调用的。
经过一些研究后,我发现问题出在保存的实例上,每当 android 垃圾收集器在不使用应用程序时杀死应用程序时,它就会存储片段的当前状态。因此,当我尝试恢复死掉的应用程序时,它会移动暂停应用程序之前选择的片段。但是该片段没有任何它必须从 it Main class.
接收到的数据解决方案:在 onCreate 方法中清除 MainActivity 中保存的实例。或者,如果您在保存的实例状态中存储任何值,则执行与保存的实例状态相关的操作,清除该值,然后调用 super.onCreate(savedInstanceState)