转自 https://bluzwong.github.io

在 Activity 中的情况

1. 使用 retained Fragment

大牛鸿洋在博文中提及一种方法 如果是大量数据,使用Fragment保持需要恢复的对象, 用法大概是

用于维持状态的 Fragment

    public class ByFragment extends Fragment {@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 设置 维持实例setRetainInstance(true);}// 需要维持状态的数据int count = 0;}

需要维持状态的 Activity:

 public class ByFragmentActivity extends Activity {SwipeRefreshLayout refreshLayout;TextView textView;ByFragment fragment;int count = 0;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_state);refreshLayout = (SwipeRefreshLayout) findViewById(R.id.refresh);textView = (TextView) findViewById(R.id.tv);// 获取 activity 的 FragmentManager 中用于维持状态数据的 Fragmentfragment = (ByFragment) getFragmentManager().findFragmentByTag("ByFragment");if (fragment == null) {fragment = new ByFragment();getFragmentManager().beginTransaction().add(fragment, "ByFragment").commit();} else {count = fragment.count;}refreshTv();refreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {@Overridepublic void onRefresh() {refreshLayout.postDelayed(new Runnable() {@Overridepublic void run() {count++;fragment.count = count;refreshTv();refreshLayout.setRefreshing(false);}}, 1000);}});}@Overrideprotected void onSaveInstanceState(Bundle outState) {super.onSaveInstanceState(outState);fragment.count = count;}}

打开 开发者选项 中的 不保留活动 以方便测试

进入到 Activity 中,count 是需要维持状态的数据

旋转屏幕

数据成功维持。

按 Home 键,置于后台,然后再返回 Activity

数据消失了。

2.使用 savedInstanceState: Bundle

这种方式比较基础,用法就不再多述

    public class ByBundleActivity extends Activity {SwipeRefreshLayout refreshLayout;TextView textView;int count = 0;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_state);refreshLayout = (SwipeRefreshLayout) findViewById(R.id.refresh);textView = (TextView) findViewById(R.id.tv);if (savedInstanceState != null) {count = savedInstanceState.getInt("KEY_COUNT", 0);}refreshTv();refreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {@Overridepublic void onRefresh() {refreshLayout.postDelayed(new Runnable() {@Overridepublic void run() {count++;refreshTv();refreshLayout.setRefreshing(false);}}, 1000);}});}@Overrideprotected void onSaveInstanceState(Bundle outState) {super.onSaveInstanceState(outState);outState.putInt("KEY_COUNT", count);}}

进入 Activity 获取数据。

旋转屏幕,数据还在。

按 Home,再回来,数据还在。

3.小结

第一种方式使用 retained Fragment,当配置发生变化时(屏幕旋转就是情况之一),其实例在内存中没有被销毁。优点是能够在 Fragment 中完整维持数据,并且不需要实现任何一种序列化的方式。缺点呢,也很明显,当长时间在后台时,难免 Activity 和 其 Fragment 会被系统所回收(开启不保留活动模拟),所以维持的数据也当然没有了。

第二种方式使用 Bundle。优点是就算被系统回收了,保存的状态也能在下一次启动时 onCreate(Bundle savedInstanceState) Bundle 中获取。缺点是,这些数据都要进行序列化、反序列化,一些复杂对象可能会出现问题,特别是如网络请求等较长时间的任务,是比较难保存的。

综上,数据尽量使用第二种 Bundle 来维持。长时间执行的任务,通过第一种 retained Fragment 来维持,旋转屏幕时,长时间的任务也没有被销毁,破费!

本文Demo

Android中 一些维持状态的经验相关推荐

  1. Android中的设计模式-状态模式

    原文出处:http://www.linuxidc.com/Linux/2015-04/116013.htm 状态模式说明 "状态模式允许一个对象在其内部状态改变的时候改变其行为.这个对象看上 ...

  2. Android 按钮选择状态,如何修改Android中的默认按钮状态而不影响按下和选择的状态?...

    汤姆, 确实如果你覆盖默认状态,你还必须覆盖按下和聚焦的状态.原因是默认的android drawable是一个选择器,所以用静态drawable覆盖它意味着你丢失了压缩和聚焦状态的状态信息,因为你只 ...

  3. Android中View绘制各种状态的背景图片原理深入分析以及StateListDrawable使用

    /* Call this to force a view to update its drawable state. This will cause drawableStateChanged to b ...

  4. Android ListView中CheckBox选中状态失效的最佳解决方案

    Android ListView中CheckBox选中状态失效: 在ListView中某一项滑到显示区外部的时候,重新划回来时其中的CheckBox的选中状态会重置,本文提出了一种解决方案,操作起来快 ...

  5. Android 中关于 FileObserver类监听文件状态的实践

    文章目录 需求背景 走进源码 实现示例 参考 需求背景 当某一个目录的文件发生变化(创建.修改.删除.移动)时,需要给一个回调事件给其他端调用. 其他场景:阅后即焚等等. 比如在 Android 的 ...

  6. Android中的状态保存-SharedPreferences和Bundle(文末小彩蛋)

    SharedPreferences 是使用键值对的方式来存储数据的.也就是说当保存一条数据的时候,需要给这条数据提供一个对应的键,这样在读取数据的时候就可以通过这个键把相应的值取出来.而且Shared ...

  7. android togglebutton 动画,如何在Android中使用ToggleButton多状态按钮控件

    如何在Android中使用ToggleButton多状态按钮控件 发布时间:2020-12-05 16:53:37 来源:亿速云 阅读:84 作者:Leah 这篇文章给大家介绍如何在Android中使 ...

  8. Android中获取软键盘状态和软键盘高度

    应用场景 在Android应用中有时会需要获取软键盘的状态(即软键盘是显示还是隐藏)和软键盘的高度.这里列举了一些可能的应用场景. 场景一 当软键盘显示时,按下返回键应当是收起软键盘,而不是回退到上一 ...

  9. android无网络状态栏,Android中检查网络连接状态的变化,无网络时跳转到设置界面...

    在AndroidManifest.xml中加一个声明 1. 2. 3. 4. 5. NetCheckReceive.java文件如下 1.import android.content.Broadcas ...

  10. Android 中Touch(触屏)事件传递机制

    版本:2.0 日期:2014.3.21 2014.3.29 版权:© 2014 kince 转载注明出处 一.基本概念 在实际开发中,经常会遇到与触屏事件有关的问题,最典型的一个就是滑动冲突.比如在使 ...

最新文章

  1. C语言逆序字符串数组,【C语言】利用栈将数组中字符串逆序
  2. 霍尼韦尔epks 操作 组态 维护 使用 硬件 手册_标准四合一气体检测仪霍尼韦尔MiniMAX X4...
  3. 浅入“Block Formatting Context”
  4. java自动装箱(是否是误区)
  5. 201609-5 祭坛
  6. CATIA 界面介绍
  7. 两个有序链表序列的交集_腾讯50题---合并两个有序链表(简单)
  8. [乱弹琴]关于2的讨论
  9. FZU 1402 猪的安家 中国剩余定理
  10. 如何使用extern在源文件之间共享变量?
  11. 海外并购频频被阻 中国芯发展之路困难重重
  12. vc 编译的那些事儿 - wowolook的专栏 - CSDN博客
  13. 创新案例分享 | 一体化政务服务平台运维项目,全力提升平台服务效能
  14. 联想笔记本电脑电池修复
  15. 大数据AI Notebook产品介绍和对比
  16. winrar命令行加压解密
  17. 什么查重软件比较好用?
  18. GYY的词典 char
  19. 学习笔记(05):【中国PHP教育大牛高洛峰】亲授php教程-PHP常量的介绍
  20. 抱薪者说 | 卫斯理:出发,从“好玩”开始

热门文章

  1. 赵小楼《天道》《遥远的救世主》深度解析(51)为什么芮小丹用脱衣这个方式来告白丁元英?
  2. window终端光标消失
  3. 循环神经网络--RNN GRU LSTM 对比分析
  4. 计算机word的关闭怎么办,为什么我的计算机word文档打开和关闭缓慢
  5. word打开老是配置进度_电脑打开Word文档弹出配置进度窗口怎么解决
  6. android动态壁纸的制作教程,android – 动态壁纸教程
  7. 机器学习速成课程_关于获得一流客户推荐的速成课程
  8. 基于Hardhat和Openzeppelin开发可升级合约(二)
  9. Flutter 利用 FFI,绕过 Android JNI 直接调用 C++ 层!
  10. git在回退版本时HEAD~和HEAD^的作用和区别