[Android Training视频系列]2.4 Recreating an Activity

Android开发 旋转屏幕导致Activity重建解决方法 Android开发文档上专门有一小节解释这个问题。简单来说,Activity是负责与用户交互的最主要机制,接下来为您详细介绍 立即下载
1.主要内容
本讲讲解onSaveInstanceState与onRestoreInstanceState的使用。

2.视频讲解

http://www.eyeandroid.com/thread-11391-1-1.html

3.翻译参考
存在一些情况,由于普通的程序行为,你的activity会被销毁,比如,当用户点击Back按钮,或者自己调用finish()方法。另外,如果activity被停止了并且很久没被使用,或者前台的系统需要更多的资源,系统也可能会销毁你的activity。

当你的activity是因为按Back键或者自己结束的,那么系统认为这个activity实例已经是不需要了,因为你的行为明确指出了你要销毁它。然而,如果系统是强制销毁你的activity的话,虽然activity实例已经没有了,不过系统能够记住它的存在,当用户从新回到这个程序时,系统会使用activity被销毁时保存的状态重新创建一个activity实例。这个系统用来恢复先前状态的保存数据被称为“实例状态”,是一些key-value的集合保存在Bundle对象中。

警告:当用户旋转屏幕时,你的activity会被销毁并且重新创建。因为屏幕配置已经改变,你的activity可能也需要加载另外一些可选择的资源(比如 布局)。

默认情况下,系统使用Bundle实例状态保存布局中每个View对象的信息(比如EditText对象中的文本值)。所以,如果你的activity对象被销毁和重新创建时,布局状态会重新恢复到先前的状态。不管怎样,你的activity可能有很多需要恢复的状态信息,比如追踪用户进程的成员变量。

为了你能够保存一些额外的数据到实例状态中,这里提供了一个额外的生命周期回调函数,它没有在前面课程的图例中显示出来。这个函数叫onSaveInstanceState(),当用户离开activity时系统会调用它。当你的activity被意外销毁时,系统会调用这个函数,函数的Bundle对象会被保存下来,所以你可以添加额外的信息给这个Bundle。然后,如果系统必须重启这个被销毁的activity,它就传递相同的Bundle对象给activity的onRestoreInstanceState()方法和onCreate()方法。
basic-lifecycle-savestate.png
图解:当系统开始停止你的activity,它呼叫onSaveInstanceState()(1)方法,因此你可以保存指定的附加状态数据。如果activity被销毁了,然后相同的实例要被重新创建,系统传递定义在(1)的状态给onCreate()(2)和onRestoreInsatanceState()(3)。

保存你的activity状态

当你的activity开始停止,系统就调用onSaveInstanceState(),你可以在这个函数中使用key-value对的集合保存信息。默认函数实现了保存activity的view状态,比如EditText的文本,或者ListView的滚动条位置。

为了保存附加信息,你必须实现onSaveInstanceState()方法,添加key-value对到Bundle对象中,例如:
  1. static final String STATE_SCORE = "playerScore";  
  2. static final String STATE_LEVEL = "playerLevel";  
  3. ...  
  4.   
  5. @Override  
  6. public void onSaveInstanceState(Bundle savedInstanceState) {  
  7.     // 保存用户当前游戏状态  
  8.     savedInstanceState.putInt(STATE_SCORE, mCurrentScore);  
  9.     savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel);  
  10.       
  11.     // 通常调用父类,让他能保存View的信息。  
  12.     super.onSaveInstanceState(savedInstanceState);  
  13. }  

警告:通常需要在onSaveInstanceState()实现中调用它的父类方法,以便能够实现保存view的信息。

恢复你的activity状态

如果你的activity在它被销毁后重启,你可以从系统传递给你的Bundle中恢复保存的状态,onCreate()和onRestoreInstanceState()都可以接受到相同的包含实例状态信息的Bundle。

因为onCreate()函数在系统创建一个新的activity实例或者重新创建前一个activity时都会调用,所以你必须在读取Bundle前检查它是否为空,如果是空的,那么系统是创建一个新的实例,如果不是,那么就恢复前一个被销毁的activity。

例如,这里是onCreate()方法中实现恢复数据:
  1. @Override  
  2. protected void onCreate(Bundle savedInstanceState) {  
  3.     super.onCreate(savedInstanceState); // Always call the superclass first  
  4.      
  5.     // 检查是否是一个前面销毁的activity实例。  
  6.     if (savedInstanceState != null) {  
  7.         // 恢复玩家状态  
  8.         mCurrentScore = savedInstanceState.getInt(STATE_SCORE);  
  9.         mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);  
  10.     } else {  
  11.         // 为新实例初始化一个默认值  
  12.     }  
  13.     ...  
  14. }  

你也可以选择在onRestoreInstranceState()方法中实现,当系统调用完onStart()函数后会调用onRestoreInstranceState(),不过仅仅是当有状态需要恢复时才会调用,所以你不需要检查Bundle是否为空:
  1. public void onRestoreInstanceState(Bundle savedInstanceState) {  
  2.     // 调用父类恢复默认的View的状态  
  3.     super.onRestoreInstanceState(savedInstanceState);  
  4.      
  5.     // 恢复玩家状态  
  6.     mCurrentScore = savedInstanceState.getInt(STATE_SCORE);  
  7.     mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);  
  8. }  

警告: 通常需要调用onRestoreInstanceState()的父类方法,以便能恢复默认的视图状态。

学习更多在运行中重建activity(比如屏幕旋转)的知识,可以看这里: Handling Runtime Changes .






Android onSaveInstanceState和onRestoreInstanceState触发的时机 主要介绍了Android onSaveInstanceState和onRestoreInstanceState触发的时机的相关资料,需要的朋友可以参考下 立即下载

相关推荐

5分钟搞定CST周期性结构仿真:共面波导色散曲线快速生成技巧

本文提供了一套在CST Studio Suite中快速仿真周期性结构并生成色散曲线的标准化流程。针对共面波导设计,重点解析了周期性边界条件的核心设置、本征模求解器(JDM算法)的优化技巧,以及通过参数扫描与后处理模板实现自动化,旨在帮助射频与微波工程师在5分钟内高效完成关键性能验证。

blue的专栏 1249

Android打造丝滑的Activity recreate重建(主题切换)过渡动画

Activity recreate重建(主题切换)过渡动画实现 当应用程序支持多种语言或主题时,切换语言或主题通常需要重新启动 Activity 以重新加载配置。虽然 recreate 是一种常用的重建 Activity 方法,但它不支持像在 Activity 之间切换时那样使用过渡动画。特别是在切换 浅色/深色 主题时,由于缺乏过渡动画而显得很生硬。为了提升改善这一点,只能自己实现过渡动画以提供更流畅的用户体验。

qq_45925230的博客 3432

东方马达步进电机AZM66AK-HS100+AZD-KD调试经验记录

东方马达步进电机AZM66AK-HS100+AZD-KD调试经验记录(20170803YC) 本次总结主要实现的功能如下:用MEXE02软件在步进电机驱动器中设置好控制动作,每个控制动作有一个特定的编号。之后通过PC和驱动器之间的485通讯,发送相关指令,使步进电机按照一定编号的控制动作运转。 参考资料:东方马达步进电机AZM66AK-HS100+AZD-KD的产品手册,可在官网下载。 A....

dahailuoa6的博客 1万+

Android培训---重建Activity

本文译自:http://developer.android.com/training/basics/activity-lifecycle/recreating.html 由于一些通常的应用程序的行为,有些时候Activity会被销毁,如当用户按下Back按钮或调用finish()方法发出自我销毁信号的时候。如果Activity被终止,并且长时间不被使用时,或者前台的Activity要求更多的资源

FireOfStar的专栏 1949

【NI Multisim 14.0原理图设计基础——元器件分类】

电阻(RESISTOR):该元器件栏中的电阻都是标称电阻,是根据真实电阻元器件而设计的,其电阻值不能改变。 排阻(RESISTOR PACK):相当于多个电阻并列封装在一个壳内,它们具有相同的阻值。 电位器(POTENTIOMETER):即可调电阻,可以通过键盘字母动态调节电阻,大写表示增加电阻值,小写表示减小电阻值,调节增量可以设置。 电容(CAPACITOR):所有电容都是无极性的,不能改变参数,没有考虑误差,也未考虑耐压大小。 电解电容器(CAP_ELECTROLIT):所有电容都是有极性的,“+”极

RL2698853114的博客 4万+

PyTorch 面试题及详细答案120题(54-70)-- 模型训练与评估

本文介绍了PyTorch模型训练的基本流程和核心概念。主要内容包括: 模型训练基本流程:通过代码示例展示了数据准备、模型定义、损失函数和优化器选择、训练循环(前向传播、反向传播、参数更新)的完整过程,并包含验证集评估的实现。 训练过程中的关键概念: Epoch:完整遍历一次训练集 Batch:将数据分成小批次 Iteration:一个Batch的参数更新过程 三者关系:1 Epoch = N/B Batch = N/B Iteration(N为样本数,B为batch_size) PyTorch数据加载机制:

大剑师兰特的GIS世界 489

Android Training - 重建一个Activity

存在一些情况,由于普通的程序行为,你的activity会被销毁,比如,当用户点击Back按钮,或者自己调用finish()方法。另外,如果activity被停止了并且很久没被使用,或者前台的系统需要更多的资源,系统也可能会销毁你的activity。 当你的activity是因为按Back键或者自己结束的,那么系统认为这个activity实例已经是不需要了,因为你的行为明确指出了你要销毁它

小何才露尖尖角 1588

Windows10环境下激活虚拟环境报错【source : 无法将“source”项识别为 cmdlet、函数、脚本文件或可运行程序的名称】

在使用Django创建Web程序前,需要创建一个虚拟的工作环境,在使用【source ll_env/bin/activate】命令激活虚拟环境时报错:source : 无法将“source”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。所在位置 行:1 字符: 2。

提供C#相关开发 、云计算、运维测试、网络安全相关技术分享与服务,有意向可联系。 1万+

阿里巴巴面试题

本文将介绍Activity的销毁和重建。销毁分两种:第一种是正常的销毁,比如用户按下Back按钮或者是activity自己调用了finish()方法;另一种是由于activity处于stopped状态,并且它长期未被使用,或者前台的activity需要更多的资源,这些情况下系统就会关闭后台的进程,以恢复一些内存。AD:干货来了,不要等!WOT2015 北京站演讲PPT开放下载...

weixin_34097242的博客 271

拉曼光谱入门:10.显微拉曼与共聚焦技术

本文系统阐述了显微拉曼光谱技术与共聚焦原理的融合机制,详细解析了从激光激发、针孔空间滤波到光谱采集的完整光路架构,阐明了共聚焦设计在提升三维空间分辨率、抑制荧光背景及实现微区无损层析方面的核心优势,并探讨了关键光学器件的性能边界与系统技术局限。

qq_53529450的博客 168

基于深度学习的停车位检测系统(UI界面 + YOLOv8/v7/v6/v5代码 + 训练数据集)

传统的停车位检测方法主要依赖于人工或基于简单图像处理的技术,存在检测速度慢、准确率低、环境适应性差等问题。近年来,随着深度学习技术的快速发展,基于目标检测的停车位检测系统已成为研究的热点。本文基于YOLO(You Only Look Once)系列模型(包括YOLOv5、YOLOv6、YOLOv7和YOLOv8),开发了一个完整的停车位检测系统,支持实时检测、结果可视化以及UI交互界面。本文实现了一个基于深度学习的停车位检测系统,采用YOLO模型在实时视频流中进行高效检测。

YOLO 332

Activity的重建(recreate)与恢复

关于Activity的重建我们可以从以下三个方面去了解: Activity会出现重建的三种情况: 1. 系统内存不足:android系统会杀死一个进程,在系统需要释放内存的时候,而位于进程内的activity就会被销毁。在用户重新回到这个Activity的时候,这个Activity 就会被重建。 2. Configuration Change(Activity横竖屏切换,进入多窗口模式):在...

mypotatolove的专栏 1万+

C#上位机性能优化全攻略:彻底解决界面卡顿+多线程死锁+PLC数据延迟,产线实测稳定运行2年

一开始我们用的是网上找的零散优化代码,根本满足不了要求,后来花了2个月的时间,把之前27条产线的代码整理、重构、优化,做了一套这套方案上线后,连续稳定运行2年零3个月:界面响应时间稳定在50ms以内,多线程死锁率持续为0,PLC数据延迟稳定在150ms以内,系统可用率≥99.99%,帮客户一年省下了超过480万的停线损失、罚款损失和人工成本,客户第二年就把剩下的22条产线也全部交给我们做了,还介绍了3家同行。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 294

Android -- Activity的销毁和重建

两种销毁                                                                               第一种是正常的销毁,比如用户按下Back按钮或者是activity自己调用了finish()方法; 另一种是由于activity处于stopped状态,并且它长期未被使用,或者前台的activity需要更多的资源,这些情况下系统...

weixin_34345560的博客 413

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

大厂Android面试秘籍: Android Activity 状态保存与恢复机制(六)

想在Android面试中脱颖而出?这篇超3万字的深度剖析不容错过!从Activity状态保存与恢复的触发时机、源码级流程,到特殊场景处理与性能优化,全维度拆解。精准命中面试高频考点,助你吃透底层原理,

Android开发领域创作者 1086

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Android知识笔记:记录一个至今仍有很多人写错的技术点,避免入坑!

Override@Override很多同学都喜欢这么写,然后还经常通过或去获取对应的 fragment。我们引出几个问题来慢慢回答:这种写法在什么情况下,会造成什么异常(问题以及对应的场景)?造成该问题的原因是(原理)?更好的写法应该是什么(提供根据 position 获取对应 Fragment 方法)?

2401_84132176的博客 493

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Android提升篇系列:Activity recreate(Activity 重新创建/自我恢复)机制(一)

注:本文中的recreate是指当内存不足时,Activity被回收,但再次来到此Activity时,系统重新恢复的过程。例如:当Activity A到Activity B时,如果内存不足,A被回收,但当用户按下Back键返回时,A又会被系统重新创建。   为了便于问题展开,我们首先来看一段最简单的代码 ----------------代码片段1------------------ ...

weixin_33912445的博客 1110

Android开发入门教程(八):重新创建Activity

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34121282的博客 294

为什么 Activity 都重建了 ViewModel 还存在?—— Jetpack 系列

ViewModel 是 Jetpack 组件中较常用的组件之一,也是实现 MVVM 模式或 MVI 模式的标准组件之一。

pengxurui的博客 916

activity直接销毁_Android -- Activity的销毁和重建

两种销毁第一种是正常的销毁,比如用户按下Back按钮或者是activity自己调用了finish()方法;另一种是由于activity处于stopped状态,并且它长期未被使用,或者前台的activity需要更多的资源,这些情况下系统就会关闭后台的进程,以恢复一些内存。需要注意的是这其中有一种情况就是屏幕旋转的问题,当用户旋转手机屏幕,每一次都会导致activity的销毁和重新建立。在第二种情况下...

weixin_39588983的博客 1877

Activity的重建机制

什么是重建?引发重建的场景有哪些? 通常是“系统资源的回收”或者’配置发生变化’导致的重建 系统资源回收是指: 当App处于背景模式的时候,可能因为系统内存不足而被回收 配置发生变化是指: 当系统配置发生变化时,比如屏幕方向、语言的改变 重建的好处? 对于资源回收的情况,保存状态并等到使用时再恢复,要比后台存留进程所占的资源要小的多 对于配置变化的情况,当屏幕方向发生变化,只有重建,才有机会加载不同的视图,当横竖屏的布局不同的话 状态保存和恢复的具体过程? 首先,"状态"是指支撑UI界面内容展示的

风吹过wu的博客 634

Android activity生命周期重走

Activity重建,Activity生命周期重走

aylr2015的博客 1518

android开发实战系列(11)-- 重建Activity

有几个情况下Activity会由于正常的程序行为而被Destory,例如当用户点击返回按钮或者是Activity通过调用finish()发出了停止信号。系统也有可能会在Activity处于stop状态且长时间不被使用、或在前台Activity需要更多系统资源的时候关闭后台进程以获取更多的内存。 当Activity是因为用户点击Back按钮或者是Activity通过调用finish()结束自己

超级方的专栏 656

android:screenOrientation的说明及旋转屏幕导致Activity被重建的解决办法

Activity在屏幕当中显示的方向。属性值可以是下表中列出的一个值: "unspecified" 默认值,由系统来选择方向。它的使用策略,以及由于选择时特定的上下文环境,可能会因为设备的差异而不同。 "user" 使用用户当前首选的方向。 "behind" 使用Activity堆栈中与该Activity之下的那个Activity的相同的方向。 "landscape...

haoxuhong的博客 4877
上一篇: 【Android您问我讲】超炫的左右滑动效果 - ViewPager的使用
下一篇: [Android Training视频系列]6.1 Saving Key-Value Sets
cofftech
博客等级 码龄16年 46粉丝 76原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值