在Android开发中,如果我们用到V4包里面的Fragment,在应用被切换到后台的时候,Activity可能被回收,但是创建的所有Fragment则会被保存到Bundle里面,下面是FragmentActivity的部分源码/**
* Save all appropriate fragment state.
*/
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Parcelable p = mFragments.saveAllState();
if (p != null) {
outState.putParcelable(FRAGMENTS_TAG, p);
}

}

,如果从最近使用的应用里面点击我们的应用,系统会恢复之前被回收的Activity,这个时候FragmentActivity在oncreate里面也会做Fragment的恢复,@Override
protected void onCreate(Bundle savedInstanceState) {
mFragments.attachActivity(this, mContainer, null);
// Old versions of the platform didn't do this!
if (getLayoutInflater().getFactory() == null) {
getLayoutInflater().setFactory(this);
}

super.onCreate(savedInstanceState);

NonConfigurationInstances nc = (NonConfigurationInstances)
getLastNonConfigurationInstance();
if (nc != null) {
mAllLoaderManagers = nc.loaders;
}
if (savedInstanceState != null) {
Parcelable p = savedInstanceState.getParcelable(FRAGMENTS_TAG);
mFragments.restoreAllState(p, nc != null ? nc.fragments : null);
}
mFragments.dispatchCreate();
}

但是此时恢复出的Fragment,在调用getActivity的时候会返回null,具体什么原因还没详细研究,这里我的解决方法是在恢复Fragment之前把保存Bundle里面的数据给清除,也就是保存的Fragment信息,然后自己重新replace。方法如下:

if(arg0 != null)
{
String FRAGMENTS_TAG = "android:support:fragments";
// remove掉保存的Fragment
arg0.remove(FRAGMENTS_TAG);
}

更多相关文章

  1. android 全局异常的捕获,保存本地以及上传服务器
  2. Android(安卓)中使用onSaveInstanceState和onRestoreInstanceSta
  3. Android(安卓)Gatekeeper流程深度解剖
  4. Android(安卓)Bitmap Api总结和使用方法
  5. Android实现图片单点旋转缩放保存-仿百度魔图
  6. Android(安卓)实现简单的画画版一
  7. Android中如何保存cookie
  8. android 内存回收原理
  9. android 使用InstanceState保存和恢复数据

随机推荐

  1. 【android】拼图实现浅谈(类似美图秀秀拼
  2. 我为什么要从一名死忠iPhone用户叛逃到An
  3. Android模拟键盘输入功能的实现
  4. Android使用后台线程提高用户体验
  5. Smart Browser Chooser 依網路速度自動切
  6. Android(安卓)避免内存泄漏
  7. Android(安卓)切换系统语言源码分析
  8. android高手之路--删除工程里面无用的代
  9. Android(安卓)API Guides---Media Router
  10. [置顶] 基于xmpp openfire smack开发之An