作者简介

微信公众号(高质量文章推送):陈博易
作者:陈博易
声明:本文是个人原创,未经允许请勿转载
商业合作请在微信公众号回复:联系方式


**## 前言

1.我记得我实习的那会,面试官问我关于acitivity的现场如何恢复,我当时也就知道保存和取值的方法,今天就当复习了。

2.同时也希望大家帮小编一起分享给其他人,让小编的文章可以让更多人看到

环境以及工具


  1. Android项目:AndroidStudio3.0

整体步骤


  1. Activity中如何保存值,如何状态恢复

详细步骤


1. Activity中保存值,状态恢复

当Andriod系统由于某种原因回收了activity,这时会调用activity的onSaveInstanceState方法保存值

   @Overrideprotected void onSaveInstanceState(Bundle outState) {super.onSaveInstanceState(outState);//存值outState.putString("test", "test");Log.d("tag", "onSaveInstanceState:test ");}

当Andriod重新创建activity,这时会调用activity的onRestoreInstanceState或者onCreate方法取出保存值

 @Overrideprotected void onRestoreInstanceState(Bundle savedInstanceState) {super.onRestoreInstanceState(savedInstanceState);//拿值,方式1String test = savedInstanceState.getString("test");Log.d("tag", "onRestoreInstanceState" + test);}
    @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main2);if (savedInstanceState != null) {//拿值,方式2String test = savedInstanceState.getString("test");Log.d("tag", "onRestoreInstanceState" + test);}}

核心步骤解读


1. 模拟当前应用被系统回收

进入开发者选项,选中不保留活动。
开启选项后,启动目标程序页面,用Home键返回桌面,稍候几秒再次点击启动目标程序。
测试完毕后,最好将刚刚选中的不保留活动的选项恢复如初。


知识盲点梳理


1. 何时回收当前应用activity

除了在栈顶的Activity,其他的Activity都有可能在内存不足的时候被系统回收,一个Activity越处于栈底,被回收的可能性就越大。

2. 何时onSaveInstanceState被执行

当某个activity变得“容易”被系统销毁时,该activity的onSaveInstanceState就会被执行,除非该activity是被用户主动销毁的,例如当用户按BACK键(手机下方的返回键)的时候。

分为以下几种情况:
- 从第一个界面跳转到第二个界面,第一个界面就会执行onSaveInstanceState
- 按下home键,运行多个其他程序,这时系统不确定会不会将该activity销毁,所以会执行onSaveInstanceState方法保存值。
- 关闭手机屏幕时
- 屏幕方向切换时,例如从竖屏切换到横屏时。(前提是androidMenifest.xml中对应activity标签没有配置)

   <!--防止系统配置改变,重新创建Activity。常见场合:弹出软键盘、屏幕旋转--><activity
            android:name=".Main2Activity"android:configChanges="orientation|keyboardHidden|screenSize"></activity>
3. 为什么我们的UI界面的值不用我们自己保存也可以自动保存,状态恢复呢?
  1. 开发者只需要为这些控件指定一个唯一的ID(通过设置android:id属性即可),剩余的事情就可以自动完成了。如果没有为控件指定ID,则这个控件就不会进行自动的数据保存和恢复操作。(不相信的可以试试看)
  2. Android应用框架中定义的几乎所有的UI控件都恰当的实现了onSaveInstanceState()方法,因此当Activity被摧毁和重建时,这些UI控件会自动保存和恢复状态数据。
4. 为什么onSaveInstanceState 执行时机会在onStop之前呢?

小编也是写文章的时候再思考这个onSaveInstanceState是在什么具体时间被条用的,所以小编就开始深入跟进源码了


看到这里小编还是没看到什么东西。
只是知道了AppCompatActivity FragmentActivity SupportActivity 分别初始化了父类的onSaveInstanceState,关键这个onSaveInstanceState是时候被调用呢?
又发现了activity中的onSaveInstanceState被一个public的方法调用了。

终于到了最想看到的方法了。也不知道什么原因无法看到哪里调了performSaveInstanceState方法,如果有高人看到指点指点了。给我评论下,应该自己的源码导入姿势不大对吧。

接下来的比较复杂,涉及到Activity启动流程在里面,本人目前也不是很清楚的,但是我比较清楚的是Activity的启动流程涉及ActivityThread与ActivityManagerService之间的通讯,实际上acitivty的启动分为应用进程端的启动和SystemServer服务进程端的启动的,而在应用进程端靠的是Intrumentation来执行一些方法的。
ActivityThread中的一些方法看着好像有点认识。和生命周期的一些方法有点像,因为perform带有执行的意思。

核心的方法到了,从这里就可以看出onSaveInstanceState方法是在onStop方法之前执行的。

private void performStopActivityInner(ActivityClientRecord r,StopInfo info, boolean keepShown, boolean saveState, String reason) {...........................省去n行代码// Next have the activity save its current state and managed dialogs...//下一步将保存当前activity的状态if (!r.activity.mFinished && saveState) {//activity还没finish并且save为trueif (r.state == null) {callCallActivityOnSaveInstanceState(r);//调用callCallActivityOnSaveInstanceState}}}

这里发现 mInstrumentation这个应用进程端的操作类调用了callActivityOnSaveInstanceState

答案好像出来了,这里就是activity.performSaveInstanceState

这里是不是就和前面的activity的performSaveInstanceState首尾呼应了呢。

总结

Android源码解析请参考这个大神的,小编的水平还是没到这个水平的。

http://blog.csdn.net/qq_23547831/article/details/51224992

个人相关教程

各种大佬推荐的编程视频资源分享
postman使用 Android java后端 接口调试工具
Android抓包 Charles http接口调试
消息推送 Android java后端集成小米推送
如何导入简单的java项目-IntelliJ IDEA

请关注我(高质量文章推送)

关注微信公众号:走向全栈工程师


模拟Android内存不足 activity回收 值保存 状态恢复相关推荐

  1. Android 内存被异常回收后直接重启APP

    做Android开发的小朋友一定会遇到程序退到后台,遇到内存被回收,导致数据为空,这时候启动APP就会出现空指针问题. 那么,我们该怎么解决这个问题呢?其实很简单,当内存被回收后,我们可以直接重启AP ...

  2. 退出android app时界面残留影响,【Android】App 或 Activity 销毁重建的状态恢复对回调带来的影响...

    问题背景 在开发 PassportSDK 时遇到的此类问题,测试反馈说当打开 App 进入登录页面,此时如果切换出去到手机设置页面将App 的定位权限设置为「拒绝授予」,在切换回 App 会发生登录信 ...

  3. Android内存优化的知识梳理

    JVM内存管理基础知识 了解JVM内存管理的基础内容,对我们理解内存分配有很大的帮助:比如Java堆的原理,JVM如何判断对象的存活.几种垃圾回收算法: 关于这部分,可以参考笔者之前写的JVM|翻越内 ...

  4. Android中Fragment数据保存和恢复

    原文地址:请扫文后stormzhang大神的微信公众号--AndroidDeveloper 写在前面 上周我们总结了Activity中数据的保存和恢复,我们花两分钟来回顾一下: Android中突发情 ...

  5. Android组件系列-----Activity保存状态

    本篇随笔将详细的讲解Activity保存状态的概念,也就是saving activity state. 一.Activity状态保持概念 保存Activity的状态是非常重要的,例如我们在玩一个游戏的 ...

  6. Android 组件系列-----Activity保存状态

    本篇随笔将详细的讲解Activity保存状态的概念,也就是saving activity state. 一.Activity状态保持概念 保存Activity的状态是非常重要的,例如我们在玩一个游戏的 ...

  7. 【Android 内存优化】内存抖动 ( 垃圾回收算法总结 | 分代收集算法补充 | 内存抖动排查 | 内存抖动操作 | 集合选择 )

    文章目录 一. 垃圾回收算法总结 二. 分代收集算法补充 三. 查看 Java 虚拟机 四. 获取 Android 应用可使用最大内存 五. 内存抖动标志 六. 排查内存抖动 七. 常见的造成内存抖动 ...

  8. Android Fragment使用(三) Activity, Fragment, WebView的状态保存和恢复

    Android中的状态保存和恢复 Android中的状态保存和恢复, 包括Activity和Fragment以及其中View的状态处理. Activity的状态除了其中的View和Fragment的状 ...

  9. android 内存回收机制

    Android APP 的运行环境 Android 是一款基于 Linux 内核,面向移动终端的操作系统.为适应其作为移动平台操作系统的特殊需要,谷歌对其做了特别的设计与优化, 使得其进程调度与资源管 ...

最新文章

  1. 原创 人物志|山东省临沭县 - 一位身残志坚的奋斗青年 - 吴忠军
  2. 简直骚操作,ThreadLocal还能当缓存用
  3. css中图片整合的使用,CSS Sprites:图片整合技术详细案例
  4. 关于Java中的线程安全(线程同步)
  5. k8s与CICD--将drone部署到kubernetes中,实现agent动态收缩
  6. linux ntp连接失败,linux ntp服务器连接异常
  7. 微信php实例代码_php微信公众平台示例代码分析(二)
  8. rabbitmq详细入门文档+springboot结合使用
  9. 计算机控制系统课程设计中期报告,课程设计中期报告模板.doc
  10. 云图说 | 华为云医疗智能体,智联大健康,AI药物研发
  11. dell服务器运维,施用smartctl查dell服务器坏道实录
  12. Java是什么?Java能干什么工作?
  13. VL2 异步复位的串联T触发器
  14. mac ubuntu双系统EFI分区修复,内置磁盘分区修复
  15. 在VS Code中开发ESP32遇到如下IDF_PATH环境变量不一致的警告问题
  16. css加透明边框,CSS3实现透明边框的方法分享
  17. Linux常用命令——mysqladmin命令
  18. ServU与IIS冲突原因:80、443端口占用
  19. [Python公开课]零基础玩转Python基础篇----第四节:Python的字符串
  20. 十月重点回顾:EasyDL八大国产芯片实现模型部署全适配!

热门文章

  1. 老用户WAU以及老用户周活跃度
  2. Ubuntu 22.10 (Kinetic Kudu) 发布
  3. 关于计算机科学与技术学科和软件工程学科的区别
  4. 多线程爬虫爬取电影天堂资源
  5. CANoe.DiVa 操作指南 -TP层测试
  6. k8s(十一)、分布式存储Cephfs使用
  7. 读aroundall的回复有感
  8. 一个身份证号能申请多少个微信公众账号?
  9. h5可拖动悬浮按钮_仙剑客栈H5如何双开 2021最新双开神器来袭
  10. 理解python __repr__()方法