activity被销毁而fragment未被销毁视图残留的处理方法
activity被销毁⽽fragment未被销毁视图残留的处理⽅法
环境描述:java7+android studio2.2+sdk14
背景描述:⽬前主流的应⽤主页⼀般是⼀个MainActivity托管⼏个fragment。我的主页MainActivity继承⾃FragmentActivity,其托管四个fragment,假设是FragmentA,FragmentB,FragmentC,来回切换不同的视图。在fragment要通过getActivity来和activity进⾏通讯;默认显⽰是fragmentA
问题描述:当操作执⾏到FragmentB时,此时按下home键将应⽤放置于后台,或者是此时点击了qq消息进⼊了qq从⽽将应⽤置于后台,此时再次回到该应⽤中会发现MainActivity重新初始化了,⽽fragment的视图并没有被销毁,导致MainActivity重新初始化后出现视图混乱重合的问题。也就是FragmentA的视图被重建并显⽰,⽽fragmentB的视图并没有被销毁掉,这两个fragment的视图重合了。这是为什么呢
问题分析:原来MainActivity切换到后台之后,由于内存不够,此MainActivity被系统回收了,⼀段时间之后回到该应⽤程序,Activity被重新实问题分析:2020第一场雪的朋友圈说说
例化了,它将调⽤⾃⾝的onSaveInstanceState⽅法来恢复其中view的状态和数据。⽽Activity被系统销毁时,它将调⽤这个⽅法将其中的view 的数据和状态等保存起来以便重新初始化时进⾏现场恢复。这⾥涉及到⼀个⽐较深层次的问题:activity的⽣命周期调⽤顺序问题(发⽣这种情况是属于异常⽣命周期调⽤,
此处不做详解,可参考我的另外⼀篇博客);我们都知道,正常情况下acitivity的⽣命周期将执⾏第⼀个⽅法时
oncreate(Bundle saveInstanceState),其中参数saveInstanceState!=null时,activity将恢复现场(恢复之前与⽤户交互时的界⾯状态和表单中输⼊的数据等),从⽽导致了这个问题的出现,知道了问题的原因就好处理了;
```
@Override
protected void onSaveInstanceState(Bundle outState) {
Parcelable p =mFragments.saveAllState();
if(p !=null) {
outState.putParcelable(FRAGMENTS_TAG,p);
}
if(mPendingFragmentActivityResults.size() >0) {
outState.putInt(NEXT_CANDIDATE_REQUEST_INDEX_TAG,mNextCandidateRequestIndex);
豆瓣唱吧等106款APP被下架int[] requestCodes =new int[mPendingFragmentActivityResults.size()];
String[] fragmentWhos =newString[mPendingFragmentActivityResults.size()];
2021年正月初六祝福图片for(inti =0;i
requestCodes[i] =mPendingFragmentActivityResults.keyAt(i);
fragmentWhos[i] =mPendingFragmentActivityResults.valueAt(i);
}
```
根据源码可以看出:当activity被销毁时重建,其上的view的状态和数据会被保存,以便数据恢复。
处理⽅法:在Main中重写protected void onSaveInstanceState(Bundle outState);如下
处理⽅法:
/**
专属鬼王小说* 当activity销毁时不保存其内部的view的状态
*@paramoutState
*/
@Override
public voidonSaveInstanceState(Bundle outState) {
//将super调⽤取消即可,表明当意外(⽐如系统内存吃紧将应⽤杀死)发⽣我不需要保存Fragmentde状态和数据等//SaveInstanceState(outState);
超兽武装2.0感谢老师的手抄报}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。