Android点击Home键后fragment重新加载问题
2016-06-30 15:07
951 查看
应用在点击Home键时,会调用onSaveInstanceState方法,随后是OnStop方法,如果需要缓存数值,就保存在onSaveInstanceState方法中,如果是长期保存的数值,就需要保存在OnStop方法中。当需要获取数值的时候,可以在OnResume方法中获取,或者在onCreate中获取。有人会问,这两者有什么区别呢?首先,在应用关闭后再次打开时(短时间内),oncreate是不会被调用的,做开发的都知道,oncreate只在第一次加载的时候调用,所以一般在点击Home键切换到后台时,调用顺序是onSaveInstanceState、onPause、onStop,再次打开时:onRestart、onStart、onResume之后Activity继续运行,但是当Home被点击后(长期时间),这时候再次打开时:oncreate、onRestart、onStart、onResume;这就是两者的区别
我们在说会我们的问题,在点击Home键之后长时间不打开应用,或者应用被其他多个应用推到底栈,Activity所占用的内存就会被回收,当再次打开加载,就会加载Oncreate方法,系统会将保存在onSaveInstanceState方法中的fragment对象释放,这时候再次去加载fragment对象,就会导致重复加载而崩溃;说完了问题,我们来聊聊解决办法:
解决办法:
方法1:在fragmentActivity里oncreate方法判断savedInstanceState==null才生成新Fragment,否则不做处理。
(此方法验证失败,由于onSaveInstanceState保存的fragment对象,所以在不为空时,当前的Activity会显示首个fragment,界面上控件没有实例化,所以全部点击失效,导致程序崩溃)
方法2:在fragmentActivity里重写onSaveInstanceState方法,但不做实现,也就是将super.onSaveInstanceState(outState)注释掉。
(方法验证失败,注释掉super.onSaveInstanceState(outState)代码,即在onSaveInstanceState方法中对fragment对象不做保存,重新加载Activity就不会导致fragment重新加载,但是依然会报错,原因不明,估计是fragment的对象无效)
@Override
protected void onSaveInstanceState(Bundle outState) {
// super.onSaveInstanceState(outState);
}
推荐:第三种,我们接着方法二来延续,取消onSaveInstanceState中的fragment对象管理的保存,并且在重新加载Oncreate方法时做出判断,如果为空,说明是刚刚打开应用,正常加载fragment,如果不为空,说明Activity曾经被回收,这时候的fragment需要重新加载,具体代码如下:
if (savedInstanceState != null) {
manager = getSupportFragmentManager();//重新创建Manager,防止此对象为空
manager.popBackStackImmediate(null, 1);//弹出所有fragment
}
再加上方法二中的代码
@Override
protected void onSaveInstanceState(Bundle outState) {
// super.onSaveInstanceState(outState);
}
manager不重复冲突,至此问题终于解决,也就是在用户Home点击切换到后台,长期不使用的情况下,再次打开重新加载应用
我们在说会我们的问题,在点击Home键之后长时间不打开应用,或者应用被其他多个应用推到底栈,Activity所占用的内存就会被回收,当再次打开加载,就会加载Oncreate方法,系统会将保存在onSaveInstanceState方法中的fragment对象释放,这时候再次去加载fragment对象,就会导致重复加载而崩溃;说完了问题,我们来聊聊解决办法:
解决办法:
方法1:在fragmentActivity里oncreate方法判断savedInstanceState==null才生成新Fragment,否则不做处理。
(此方法验证失败,由于onSaveInstanceState保存的fragment对象,所以在不为空时,当前的Activity会显示首个fragment,界面上控件没有实例化,所以全部点击失效,导致程序崩溃)
方法2:在fragmentActivity里重写onSaveInstanceState方法,但不做实现,也就是将super.onSaveInstanceState(outState)注释掉。
(方法验证失败,注释掉super.onSaveInstanceState(outState)代码,即在onSaveInstanceState方法中对fragment对象不做保存,重新加载Activity就不会导致fragment重新加载,但是依然会报错,原因不明,估计是fragment的对象无效)
@Override
protected void onSaveInstanceState(Bundle outState) {
// super.onSaveInstanceState(outState);
}
推荐:第三种,我们接着方法二来延续,取消onSaveInstanceState中的fragment对象管理的保存,并且在重新加载Oncreate方法时做出判断,如果为空,说明是刚刚打开应用,正常加载fragment,如果不为空,说明Activity曾经被回收,这时候的fragment需要重新加载,具体代码如下:
if (savedInstanceState != null) {
manager = getSupportFragmentManager();//重新创建Manager,防止此对象为空
manager.popBackStackImmediate(null, 1);//弹出所有fragment
}
再加上方法二中的代码
@Override
protected void onSaveInstanceState(Bundle outState) {
// super.onSaveInstanceState(outState);
}
manager不重复冲突,至此问题终于解决,也就是在用户Home点击切换到后台,长期不使用的情况下,再次打开重新加载应用
相关文章推荐
- Android Push Notification(androidpn)学习一
- Android ScrollView中嵌套GridView,ListView
- 【Android】如何通知MediaScanner扫描出指定文件
- android客户端更新常规流程
- Android瀑布流照片墙实现,体验不规则排列的美感
- Android 事件总线Otto框架详解二
- android EventBus 学习(二)
- Android5.0 拦截第三方推送的通知消息
- Android Design Support Library 中控件的使用简单介绍(一)
- android-Paint
- 15 个 Android 通用流行框架大全 2016
- Android studio gradle构建工程的时候很慢经常报错解决方案
- 从Android代码中来记忆23种设计模式
- Android bug——Launcher 0x506导致花屏问题
- Android应用开发学习—Toast使用方法
- Android通用流行框架大全
- 如何使用Cordova获取Android的唯一标识符
- AndroidStudio 快捷键
- Android Studio系列教程3 (快捷键)
- 本文转载Doctorq原创文章: Android Framework中的Application Framework层介绍