模拟Android内存不足 activity回收 值保存 状态恢复
作者简介
微信公众号(高质量文章推送):陈博易
作者:陈博易
声明:本文是个人原创,未经允许请勿转载
商业合作请在微信公众号回复:联系方式
**## 前言
1.我记得我实习的那会,面试官问我关于acitivity的现场如何恢复,我当时也就知道保存和取值的方法,今天就当复习了。
2.同时也希望大家帮小编一起分享给其他人,让小编的文章可以让更多人看到
环境以及工具
- Android项目:AndroidStudio3.0
整体步骤
- 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界面的值不用我们自己保存也可以自动保存,状态恢复呢?
- 开发者只需要为这些控件指定一个唯一的ID(通过设置android:id属性即可),剩余的事情就可以自动完成了。如果没有为控件指定ID,则这个控件就不会进行自动的数据保存和恢复操作。(不相信的可以试试看)
- 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回收 值保存 状态恢复相关推荐
- Android 内存被异常回收后直接重启APP
做Android开发的小朋友一定会遇到程序退到后台,遇到内存被回收,导致数据为空,这时候启动APP就会出现空指针问题. 那么,我们该怎么解决这个问题呢?其实很简单,当内存被回收后,我们可以直接重启AP ...
- 退出android app时界面残留影响,【Android】App 或 Activity 销毁重建的状态恢复对回调带来的影响...
问题背景 在开发 PassportSDK 时遇到的此类问题,测试反馈说当打开 App 进入登录页面,此时如果切换出去到手机设置页面将App 的定位权限设置为「拒绝授予」,在切换回 App 会发生登录信 ...
- Android内存优化的知识梳理
JVM内存管理基础知识 了解JVM内存管理的基础内容,对我们理解内存分配有很大的帮助:比如Java堆的原理,JVM如何判断对象的存活.几种垃圾回收算法: 关于这部分,可以参考笔者之前写的JVM|翻越内 ...
- Android中Fragment数据保存和恢复
原文地址:请扫文后stormzhang大神的微信公众号--AndroidDeveloper 写在前面 上周我们总结了Activity中数据的保存和恢复,我们花两分钟来回顾一下: Android中突发情 ...
- Android组件系列-----Activity保存状态
本篇随笔将详细的讲解Activity保存状态的概念,也就是saving activity state. 一.Activity状态保持概念 保存Activity的状态是非常重要的,例如我们在玩一个游戏的 ...
- Android 组件系列-----Activity保存状态
本篇随笔将详细的讲解Activity保存状态的概念,也就是saving activity state. 一.Activity状态保持概念 保存Activity的状态是非常重要的,例如我们在玩一个游戏的 ...
- 【Android 内存优化】内存抖动 ( 垃圾回收算法总结 | 分代收集算法补充 | 内存抖动排查 | 内存抖动操作 | 集合选择 )
文章目录 一. 垃圾回收算法总结 二. 分代收集算法补充 三. 查看 Java 虚拟机 四. 获取 Android 应用可使用最大内存 五. 内存抖动标志 六. 排查内存抖动 七. 常见的造成内存抖动 ...
- Android Fragment使用(三) Activity, Fragment, WebView的状态保存和恢复
Android中的状态保存和恢复 Android中的状态保存和恢复, 包括Activity和Fragment以及其中View的状态处理. Activity的状态除了其中的View和Fragment的状 ...
- android 内存回收机制
Android APP 的运行环境 Android 是一款基于 Linux 内核,面向移动终端的操作系统.为适应其作为移动平台操作系统的特殊需要,谷歌对其做了特别的设计与优化, 使得其进程调度与资源管 ...
最新文章
- 原创 人物志|山东省临沭县 - 一位身残志坚的奋斗青年 - 吴忠军
- 简直骚操作,ThreadLocal还能当缓存用
- css中图片整合的使用,CSS Sprites:图片整合技术详细案例
- 关于Java中的线程安全(线程同步)
- k8s与CICD--将drone部署到kubernetes中,实现agent动态收缩
- linux ntp连接失败,linux ntp服务器连接异常
- 微信php实例代码_php微信公众平台示例代码分析(二)
- rabbitmq详细入门文档+springboot结合使用
- 计算机控制系统课程设计中期报告,课程设计中期报告模板.doc
- 云图说 | 华为云医疗智能体,智联大健康,AI药物研发
- dell服务器运维,施用smartctl查dell服务器坏道实录
- Java是什么?Java能干什么工作?
- VL2 异步复位的串联T触发器
- mac ubuntu双系统EFI分区修复,内置磁盘分区修复
- 在VS Code中开发ESP32遇到如下IDF_PATH环境变量不一致的警告问题
- css加透明边框,CSS3实现透明边框的方法分享
- Linux常用命令——mysqladmin命令
- ServU与IIS冲突原因:80、443端口占用
- [Python公开课]零基础玩转Python基础篇----第四节:Python的字符串
- 十月重点回顾:EasyDL八大国产芯片实现模型部署全适配!