Android官方开发文档Training系列课程中文版:管理Activity的生命周期之Activity的重建

原文地址:http://android.xsoftlab.net/training/basics/activity-lifecycle/recreating.html#RestoreState

有这么几个关于activity通过正常渠道销毁的场景,比如用户按下了返回按钮,又或者是在activity中调用了终止信号finish。系统可能也会在activity在停止状态时销毁它,也可能会在长时间不使用的时候销毁它,也可能会当前台activity需要更多资源时,系统必须关掉后台进行来恢复内存时销毁它。

当activity因为用户按下了返回按钮或者是自己关闭而被销毁的话,系统会认为activity的实例是永远消失了,因为习惯上会认为activity已经不再需要了。然而,如果activity是因为系统资源枯竭而被销毁的话,尽管activity的实例已经被销毁了,系统会记得它存在过,以便用户在返回的时候系统可以创建一个新的activity实例,并且通过上一个activity销毁时保存的一系列数据来恢复当时的状态。系统恢复原先的状态时通过一个名为instance state的对象存储的数据,它是一个Bundle对象,并以键值对的方式存储数据的集合。

警告:在每次用户旋转屏幕的时候,activity会被销毁并重新创建。当屏幕改变的方向,系统会销毁并重新创建当前的activity,因为屏幕的配置发生了改变,activity可能需要加载更改后的资源(比如说布局)。

默认情况下,系统使用Bundle对象存储activity不居中每一个View对象的信息(比如说在EditText中输入的内容)。所以如果activity对象被销毁然后重新创建了的话,可以不必再写多少代码就可以恢复布局的状态到原来的状态。然而,activity可能有更多的状态信息需要恢复,比如activity中记录用户进度的成员变量。

Note:为了使Android系统可以保存activity中view的状态,每一个VIEW必须拥有唯一的ID,支持android:id属性。

为了保存activity状态的附加数据,你必须重写onSaveInstanceState方法。系统会在用户离开的时候调用这个方法,并且会传回一个Bundle对象,这个对象可以用来在activity意外被销毁的事件中保存下来。如果系统稍后必须创建activity实例,系统会通过onRestoreInstanceState方法和onCreate方法传递相同的Bundle对象。

随着系统开始停止activity,它会调用onSaveInstanceState(1),所以你可以指定一些在稍后恢复的时候所需要的附加状态数据。如果activity销毁了,然后一个相同的实例必须重新创建,那么系统会通过onCreate方法(2)和onRestoreInstanceState(3)方法将默认的状态数据传递回来。

存储Activity的状态

随着activity开始进入停止状态,系统会调用onSaveInstanceState方法,所以activity可以存储一系列的状态信息。这个方法的默认实现是保存了一些与activity的view层级相关额信息,比如在EditText空间中的内容,又或者是ListView的滑动位置。

为了保存activity的附加状态信息,必须实现onSaveInstanceState方法然后添加键值对到Bundle对象中:

static final String STATE_SCORE = "playerScore";
static final String STATE_LEVEL = "playerLevel";
...
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {// Save the user's current game statesavedInstanceState.putInt(STATE_SCORE, mCurrentScore);savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel);// Always call the superclass so it can save the view hierarchy statesuper.onSaveInstanceState(savedInstanceState);
}

警告:因为总是调用了onSaveInstanceState的父类实现,所以默认实现可以保存view层级的状态。

恢复Activity的状态

如果之前的activity销毁了之后又重新创建了,可以通过Bundle对象恢复保存的状态。onCreate方法和onSaveInstanceState方法都会将相同的Bundle对象通过参数回调回来。

因为onCreate方法在系统创建新实例的时候会调用,你必须在尝试访问它之前检查Bundle对象是否为null,如果是null,那说明系统创建了一个新的activity对象,否则就是原来的那个对象被销毁了这里又重新创建了一个。

以下是如何在onCreate方法中恢复一些状态数据的例子:

@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState); // Always call the superclass first// Check whether we're recreating a previously destroyed instanceif (savedInstanceState != null) {// Restore value of members from saved statemCurrentScore = savedInstanceState.getInt(STATE_SCORE);mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);} else {// Probably initialize members with default values for a new instance}...
}

除了onCreate方法可以恢复状态之外,onRestoreInstanceState()方法同样也可以实现该功能,该方法会在onStart方法之后调用,不过仅仅是在保存了数据之后才会调用,所以你不需要去做Bundle对象是否为null的检查:

public void onRestoreInstanceState(Bundle savedInstanceState) {// Always call the superclass so it can restore the view hierarchysuper.onRestoreInstanceState(savedInstanceState);// Restore state members from saved instancemCurrentScore = savedInstanceState.getInt(STATE_SCORE);mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
}

警告:因为总是调用了onRestoreInstanceState()的父类实现,所以默认实现可以恢复view层级的状态。

有关更多因为在运行时的重启事件而造成的activity重新创建(比如屏幕旋转)的信息,请参见Handling Runtime Changes。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/479303.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java动态追踪技术探究

引子 在遥远的希艾斯星球爪哇国塞沃城中,两名年轻的程序员正在为一件事情苦恼,程序出问题了,一时看不出问题出在哪里,于是有了以下对话: “Debug一下吧。” “线上机器,没开Debug端口。” “看日志&#xf…

论文浅尝 | 从树结构的长短期记忆网络改进语义表示

论文笔记整理:窦春柳,天津大学硕士,方向:自然语言处理链接:https://arxiv.org/pdf/1503.00075.pdf动机由于长短期记忆网络(LSTM)这种具有复杂单元的循环神经网络具有良好的表示序列信息的能力&a…

详解NLP技术中的:预训练模型、图神经网络、模型压缩、知识图谱

NLP近几年非常火,且发展特别快。像BERT、GPT-3、图神经网络、知识图谱等技术应运而生。我们正处在信息爆炸的时代、面对每天铺天盖地的网络资源和论文、很多时候我们面临的问题并不是缺资源,而是找准资源并高效学习。但很多时候你会发现,花费…

Android官方开发文档Training系列课程中文版:使用Fragment构建动态UI之Fragment创建

原文地址:http://android.xsoftlab.net/training/basics/fragments/index.html 导言 为了在Android中创建动态的多面板用户界面,你需要将UI组件和活动的行为封装到模块中,这些模块可以在activity中互相交换。你可以使用类Fragment创建这些模…

基于深度学习的信息抽取技术

DeepIE: Deep Learning for Information Extraction DeepIE: 基于深度学习的信息抽取技术(预计2020年8月31日前全部更新完毕) TOP 知乎专栏文章:nlp中的实体关系抽取方法总结知乎专栏文章:如何有效提升中文NER性能&…

根因分析初探:一种报警聚类算法在业务系统的落地实施

背景 众所周知,日志是记录应用程序运行状态的一种重要工具,在业务服务中,日志更是十分重要。通常情况下,日志主要是记录关键执行点、程序执行错误时的现场信息等。系统出现故障时,运维人员一般先查看错误日志&#xff…

论文浅尝 | BAG:面向多跳推理问答得双向 Attention 实体图卷积网络

论文笔记整理:谭亦鸣,东南大学博士生,研究兴趣:知识图谱问答来源:NAACL 2019链接:https://www.aclweb.org/anthology/N19-1032/实现多跳推理问答需要模型能够充分理解文本和 query 之间的关系,本…

Android官方开发文档Training系列课程中文版:使用Fragment构建动态UI之构建灵活的UI

原文地址:http://android.xsoftlab.net/training/basics/fragments/fragment-ui.html 当设计应用程序时需要支持尺寸较大的宽屏设备时,可以基于可用的屏幕空间在不同的布局中配置并重新使用fragment来提升用户体验。 举个例子,手持设备在同…

LeetCode 669. 修剪二叉搜索树

1. 题目 给定一个二叉搜索树,同时给定最小边界L 和最大边界 R。通过修剪二叉搜索树,使得所有节点的值在[L, R]中 (R>L) 。你可能需要改变树的根节点,所以结果应当返回修剪好的二叉搜索树的新的根节点。 来源:力扣&#xff08…

Pytorch翻车记录:单卡改多卡踩坑记!

文 | 哟林小平知乎先说明一下背景,目前正在魔改以下这篇论文的代码:https://github.com/QipengGuo/GraphWriter-DGLgithub.com由于每次完成实验需要5个小时(baseline),自己的模型需要更久(2倍)&…

使用docker部署flask项目

前言 本次部署是把2个项目、mysql、redis、uwsgi封装在一个容器中,ngnix封装在一个容器中 实际应用中最好是: 项目和uwsgi封装在一个容器中mysql单独封装,可能还要读写分离,主从同步等redis单独封装,可能还要读写分离&…

论文浅尝 | DRUM:一种端到端的可微的知识图谱上的规则学习方法

论文笔记整理:张文,浙江大学在读博士,研究方向为知识图谱的表示学习,推理和可解释。现有的多数链接预测方法都不能处理新的实体,并且多为黑盒方法,使得其预测结果无法解释。本文提出了一种新的端到端的可微…

WSDM Cup 2019自然语言推理任务获奖解题思路

WSDM(Web Search and Data Mining,读音为Wisdom)是业界公认的高质量学术会议,注重前沿技术在工业界的落地应用,与SIGIR一起被称为信息检索领域的Top2。 刚刚在墨尔本结束的第12届WSDM大会传来一个好消息,由…

LeetCode 637. 二叉树的层平均值(层次遍历queue)

1. 题目 给定一个非空二叉树, 返回一个由每层节点平均值组成的数组. 输入:3/ \9 20/ \15 7 输出: [3, 14.5, 11] 解释: 第0层的平均值是 3, 第1层是 14.5, 第2层是 11. 因此返回 [3, 14.5, 11].2. 解题 queue按层遍历,每次进入循环记录队列长度n class So…

Android官方开发文档Training系列课程中文版:使用Fragment构建动态UI之与其它Fragment通信

原文地址:http://android.xsoftlab.net/training/basics/fragments/communicating.html 为了可以重复使用Fragment UI组件,你应该将fragment构建为一个完整的独立的模块化组件,并且它可以定义自己的布局和行为习惯。你只要定义了一次这类可复…

AI框架你只会调包,这种想法很危险!

深度学习神经网络正步入成熟,而深度学习框架目前众多,大都可以在图像识别、手写识别、视频识别、语音识别、目标识别和自然语言处理等诸多领域大显身手。深度学习框架平台占据人工智能产业生态的核心地位,具有统领产业进步节奏、带动终端场景…

Docker镜像大小

都说容器大法好,可是假设没有Docker镜像,Docker该是多无趣啊。 是否还记得第一个接触Docker的时候,你从Docker Hub下拉的那个镜像呢?在那个处女镜像的基础上。你执行了容器生涯的处女容器。镜像的基石作用已经非常明显。在Docker…

论文浅尝 | 机器阅读理解中常识知识的显式利用

论文笔记整理:吴林娟,天津大学硕士,自然语言处理方向。链接:https://arxiv.org/pdf/1809.03449.pdf动机机器阅读理解(MRC)和人类进行阅读理解之间还存在差距,作者认为主要体现在对于数据的需求和噪声鲁棒性上&#xff…

深度学习在美团配送ETA预估中的探索与实践

1.背景 ETA(Estimated Time of Arrival,“预计送达时间”),即用户下单后,配送人员在多长时间内将外卖送达到用户手中。送达时间预测的结果,将会以”预计送达时间”的形式,展现在用户的客户端页面…

在AndroidStudio中配置Gradle进行 “动态编译期间,根据远程服务器地址 ,生成多类安装包”

原文地址:http://www.cnblogs.com/vir56k/p/4763810.html 需求: 在产品开发中,经常需要发布各个版本,每个版本的服务器地址有不同的服务器地址。比如 开发 服务器使用 192.168.1.232服务器,测试 服务器使用 192.168.1.…