【发布时间】:2025-12-28 09:05:11
【问题描述】:
我正在构建一个具有以下结构的应用程序。
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;
}
在MainActivity 中实现的interface 的帮助下,从运行片段中调用requestChangeFragment()。
【问题讨论】:
-
你能再贴一些代码吗?像 onResume 和 onPause 方法
-
除了日志之外,这些方法中基本上没有任何内容。即使我尝试在这些片段中使用 Crashlytics,它也会崩溃。 (错误是,Crashlytics 未初始化)如果我尝试初始化 Crashlytics,其显示上下文不能为空。
-
您可能没有很好地管理生命周期。这是一个很好的教程,如果你想阅读它raywenderlich.com/117838/…
-
我正在尽可能地处理生命周期,但是当用户在没有关闭应用程序的情况下进入 android home 并且应用程序进程被 Android 垃圾收集器杀死时会出现问题。
-
您永远不应该调用
Activity或Fragment的生命周期回调(onPause()等)。系统会自行处理。
标签: android android-fragments transactionmanager