onSaveInstance先做大概了解

onSaveInstance(Bundle outState)方法用于内存回收时,持久化数据用。

大多数app会直接改成内存回收后,直接重启app,这样也是有好处的:

  1. 免去再次打开时,先闪屏再加载数据。 体验不太好。
  2. 开发也便利,不需要记录状态,直接重启app,简单便捷

有优点必然就有缺点:

  1. 有些界面需要记录状态并在再次打开时恢复当时的状态,明显,这种实现直接被放弃了。

目前介绍数据持久化时遇到的问题

Activity 有两个onSaveInstance方法
@Override
protected void onSaveInstanceState(Bundle outState) {super.onSaveInstanceState(outState);
}
@Override
public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {super.onSaveInstanceState(outState, outPersistentState);
}Fragment 只有一个onSaveInstance方法
@Override
protected void onSaveInstanceState(Bundle outState) {super.onSaveInstanceState(outState);
}
复制代码
protected 对应的方法会在横竖屏切换、按Home键、第三方打开本地应用等操作下会调用。 Public 的不会。

遇到的问题及解决方案:

1、FragmentManager().beginTransaction()操作fragment时, 如果切换到后台一段时间后,内存被回收了,再次打开app, 界面恢复,会出现两个fragment重叠的问题。

原因:fragmentManager操作的fragment,会在内存销毁前,自动保存在(@Nullable Bundle savedInstanceState)中,再次打开后,会自动恢复fragment。 然后再次走oncreate方法,按顺序新建新的fragment,并被fragmentManager加入。这样就造成了重叠的两个fragment。
解决:
第一步、在fragmentmanager加入fragment时,设置tag
getSupportFragmentManager().beginTransaction().add(getFragmentContentId(), fragment,tag).commit();
复制代码
 第二步、在
protected void onCreate(@Nullable Bundle savedInstanceState) 方法中做相应处理处理的方式有两种,一种就是恢复之前保存的,不做新建操作。
if (null != savedInstanceState) {if (null != getSupportFragmentManager().findFragmentByTag(BoxApiConstant.BOX_VIEW_PAGER_FRAGMENT_TAG)) {boxViewPagerFragment =(BoxViewPagerFragment) getSupportFragmentManager().findFragmentByTag(BoxApiConstant.BOX_VIEW_PAGER_FRAGMENT_TAG);}
}第二种就是直接去掉保存的,使用新建的。if (null != savedInstanceState) {if (null != getSupportFragmentManager().findFragmentByTag(BoxApiConstant.BOX_VIEW_PAGER_FRAGMENT_TAG)) {getSupportFragmentManager().beginTransaction().remove(getSupportFragmentManager().findFragmentByTag(BoxApiConstant.BOX_VIEW_PAGER_FRAGMENT_TAG)).commitNow();}
}复制代码

2、onSaveInstance并不是只有在内存回收时才调用, 横竖屏切换、按Home键、调用第三方程序时(比如调用第三方程序打开)也会走这个方法。但我们有时候并不需要上面三种情况下走onSaveInstance方法中的逻辑。

解决(个人的解决方法):
1. 使用一个boolean值,比如isBackShow,在调用onSaveInstance时就把isBackShow设置为true。
2. 如果此时的onSaveInstance并不是自己想要的,就在onResume方法中去掉这次保存,并把isBackShow设置为false
3. onResume方法中,加个判断条件if (isBackShow) {}加这个boolean值的原因是,如果内存并未被回收,则此场景并不是我们想要的恢复数据的场景,则去掉在onSaveInstance方法中保存的数据。如果内存被回收了,则isBackShow会在界面重回时被重置成默认值false,所以并不会走onresume方法中关于去掉保存值的逻辑。
复制代码

最后,贴上关于内存回收后,再次打开重启app的操作连接。

被回收后,重启APP

转载于:https://juejin.im/post/5a7908a05188257a60497608

android onSaveInstance方法项目中的实践相关推荐

  1. Effective Dart 文档注释在Flutter项目中的实践

    前言 什么是注释? 在编程语言中,注释就是对代码的解释和说明,其目的是让人们能够更加轻松地了解代码. 也有一句话是这样说的:程序员都讨厌两件事,1.别人不写注释 2.自己写注释 在开发者社区里,我不止 ...

  2. Protobuf 的 import 功能在 Go 项目中的实践

    业务场景 我们会有这样的需求:在不同的文件夹中定义了不同的 proto 文件,这些不同的文件夹可能是一些不同的 gRPC 服务.因为不想重复定义某一个 message,所以其中一个服务可能会用到其他服 ...

  3. 数加平台在数据挖掘项目中的实践

    目录 背景 数据源 数据处理 模型训练及预测 数据可视化 总结 1. 背景 返回目录 随着越来越多的公司开始重视数据的积累和产品的敏捷开发,数据量的不断增加和开发周期的不断缩短,就形成了一对明显的矛盾 ...

  4. 数加平台在数据挖掘项目中的实践 1

    目录 背景 数据源 数据处理 模型训练及预测 数据可视化 总结 1. 背景 返回目录 随着越来越多的公司开始重视数据的积累和产品的敏捷开发,数据量的不断增加和开发周期的不断缩短,就形成了一对明显的矛盾 ...

  5. [项目管理]工业工程理论在软件项目中的实践

    摘要:结合工业工程理论,对公司现有软件项目开发流程进行总结分析,优化项目管理流程.提升项目作业效率. 关键词:工作研究:流程分析:降低成本 引言 本人在IT行业从事软件开发工作,经过本学期工业工程伦理 ...

  6. Android Studio 在项目中引用第三方jar包

    在Android Studio项目中引用第三方jar包的方法: 步骤: 1.在build.gradle文件中添加如下代码: 备注:要添加在Android作用域下 sourceSets {main {j ...

  7. methods vue过滤器 和_数据动态过滤技巧在 Vue 项目中的实践

    这个问题是在下在做一个 Vue 项目中遇到的实际场景,这里记录一下我遇到问题之后的思考和最后怎么解决的(老年程序员记性不好 -.-),过程中会涉及到一些Vue源码的概念比如 $mount. rende ...

  8. 网关 Apache APISIX 在 360 基础运维平台项目中的实践

    女主宣言 今天小编为大家分享一篇关于Apache APISIX的文章,文章从开发者的角度讲述了 Apache APISIX 网关在 360 基础运维平台的落地实践,希望能对大家有所帮助. PS:丰富的 ...

  9. Android VideoView播放 项目中的 视频文件 自动横屏 全屏播放

    记录最近遇到的一个android播放视频的需求: APP主页上方有一个操作演示字样的入口,点击后开始播放一段视频,视频文件是放在工程里的. 话说以前还没做过类似播放视频的功能,根据以往的经验来看,最简 ...

最新文章

  1. 《中国顶尖技术团队访谈录·第二季》发布
  2. SQL Server新一轮更新
  3. PHP array_key_exists() 函数(判断某个数组中是否存在指定的 key)
  4. 关于mysql服务器3306端口不能远程连接的解决
  5. 安装linux18双系统,Win10 安装Linux ubuntu-18.04双系统(安装指南)
  6. python if else break_Python的for和break循环结构中使用else语句的技巧
  7. CSS基础选择器之类选择器(CSS、HTML)
  8. jQueryEasyUI应用 – datagrid之CRUD应用
  9. C/C++学习路线(总体把握C/C++)
  10. 分布式存储系统学习笔记(一)—什么是分布式系统(3)—复制
  11. 如何看懂公司的财务报表(1)
  12. 腾讯发布三项息争前提 360将扣扣保镖下线
  13. iOS storyBoard 和 纯代码 实现 九宫格 切图
  14. excel查找出不来了_Excel查找明明存在的数据却查不到,是什么原因?|excel表格数据为什么搜查不到...
  15. 三十八. geotrellis使用 COG 写入和读取
  16. Codeforces 450 B. Jzzhu and Sequences
  17. 搭建Android开发环境Win7-64位
  18. 为什么程序员话少钱多死得早?-一位人生悲惨的程序员与你讲述其中原因
  19. 分词工具比较及使用(ansj、hanlp、jieba)
  20. oracle table()函数用法

热门文章

  1. JAVA服务器没回应_Java Socket为什么服务器无法回复客户端
  2. mysql 机器复制_MySQL复制在同一台机器上
  3. vscode新建文件的快捷键_Mac怎么创建txt文件?如何设置新建txt的快捷键?
  4. linux系统ftp优化,Linux vsftp 部署优化
  5. linux 格式化up命令,uptime 命令介绍
  6. mysql调用短信接口_短信平台接口调用方法参考
  7. 马士兵java教程笔记_马士兵java教程笔记4
  8. Python Machine Learning Windows 安装包网址
  9. Calendar的api方法
  10. Java讲课笔记30:事件处理机制