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

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

在activity的生命周期内,适当的停止和重新启动activity是一个非常重要的过程,它可以确保用户能感觉到APP一直是存活状态,并且不会丢失他们的进度。这里有几项关键的场景适用于activity停止与重启:

  • 用户打开了最新使用APP的窗口然后从你的APP切换到了别的APP上。现在APP内的activity当前位于后台,并且处于停止状态。如果用户从设备屏幕的主界面通过点击图标或者从最近使用APP的窗口返回了了App,那么原来的那个activity则会重新启动。
  • 用户在APP内执行了一个启动新activity的动作。那么当前的这个activity会在第二个activity创建的时候停止。如果用户按下了返回按钮,则第一个activity会被重启。
  • 用户在使用APP的时候接到了一个电话。

Activity类提供了两个生命周期函数,onStop和onRestart,它们可以使activity单独的处理停止状态和重启状态。和局部UI被遮挡的暂停状态不同,停止状态保证UI一定是不可见的,并且用户的焦点转移到了另一个Activity上。

Note:因为系统会在activity停止的时候驻留在内存中,所以你可能不需要实现onStop方法和onResume方法,甚至是onStart方法。为了大多数活动相对简单,activity只需要停止和重启就好了,你可能只需要使用onPause方法来暂停一些正在进行中的活动并且释放系统资源。


上图:当用户离开了activity,系统会调用onStop方法停止activity(1)。如果用户从activity的停止状态返回了,系统会调用onRestart方法(2),然后会很快的接着调用onStart方法(3)和onResume方法(4)。注意不用关心activity在停止的时候的状况,因为系统总是会在onStop之前调用onResume。

停止Activity

当activity的onStop方法被调用了,这时,activity不再可见,并且需要释放用户不需要使用的所有资源。activity一旦停止,如果系统需要恢复系统内存的话,系统会销毁这个activity。在极端情况下,系统会将整个APP杀死,并且不会调用activity的onDestory方法,所以应该使用onStop方法释放资源,因为这些资源可能会引起内存泄露,这是很严重的。

尽管onPause方法在onStop之前被调用了,你应该使用onStop执行更大、更多的CPU高负荷操作,比如将信息写入数据库。

这个例子实现了onStop方法,方法内对草稿内容进行了持久化存储:

@Override
protected void onStop() {super.onStop();  // Always call the superclass method first// Save the note's current draft, because the activity is stopping// and we want to be sure the current note progress isn't lost.ContentValues values = new ContentValues();values.put(NotePad.Notes.COLUMN_NAME_NOTE, getCurrentNoteText());values.put(NotePad.Notes.COLUMN_NAME_TITLE, getCurrentNoteTitle());getContentResolver().update(mUri,    // The URI for the note to update.values,  // The map of column names and new values to apply to them.null,    // No SELECT criteria are used.null     // No WHERE columns are used.);
}

当activity处于停止状态时,Activity对象会驻留在系统中,然后当activity恢复的时候会被重新调用。你不需要重新实例化那些在其它回调方法内创建的对象。系统会保持布局中的每一个View的状态,所以如果用户在EditText中输入了文字,那么这些内容会保持在内存中,所以不需要专门去保存和恢复它。

Note:甚至是activity在停止的状态被系统销毁了,仍然可以在一个Bundle中保存View对象的状态(比如EditText中的文本),并且可以在用户返回了这类Activity的实例(原来的对象已被销毁,这个对象是又重新创建的)时恢复它们(下节课会讨论有关在Activity销毁和重新创建的时候使用Bundle存储或读取其它状态的数据)。

启动/重新启动Activity

当Activity从停止状态返回了前台,系统会调用onRestart方法和onStart方法,这样的调用会每次出现在activity可见的时候。然而onRestart方法只是被在activity从停止状态恢复的时候被调用,所以可以使用这个方法执行一些特别的必须的恢复工作,只限于activity先前处于停止状态而不是销毁状态。

APP使用onRestart方法恢复activity的状态并不通用,所以这里没有该方法的可以适用于一般受欢迎的APP的使用样例。然而,因为onStop方法本来应该清理所有的activity资源,所以在activity重启的时候需要重新实例化它们。还有,你也应该在activity第一次创建的时候实例化它们(当这个activity的实例不存在的时候)。对于这个原因,你应该使用与onStop方法相对应的onStart方法,因为系统会在创建activity时候和在停止状态下重启activity的时候都会调用onStart方法。

举个例子,因为用户可能有多种方式将长时间不可见的activity重新带回来,所以onStart方法是一个验证系统特性是否可用的好地方:

@Override
protected void onStart() {super.onStart();  // Always call the superclass method first// The activity is either being restarted or started for the first time// so this is where we should make sure that GPS is enabledLocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);boolean gpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);if (!gpsEnabled) {// Create a dialog here that requests the user to enable GPS, and use an intent// with the android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS action// to take the user to the Settings screen to enable GPS when they click "OK"}
}
@Override
protected void onRestart() {super.onRestart();  // Always call the superclass method first// Activity being restarted from stopped state    
}

当系统需要销毁Activity时,它会调用activity的onDestory方法。因为在通常情况下,你会在onStop方法中释放大部分资源,那么在onDestory方法内不需要再做什么工作。这个方法是清理可能会导致内存泄露的资源的最后机会,所以你应该确保其它附属线程以及其它类似方法跟踪的长时间运行的工作也被销毁。

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

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

相关文章

selenium.common.exceptions.WebDriverException: Message: ‘chromedriver’解决

selenium.common.exceptions.WebDriverException: Message: chromedriver’解决: https://blog.csdn.net/weixin_44318830/article/details/103339273 今天在做selenium测试的时候,可能是很久没用了,直接报了这个异常! 相信很多第一次学习selenium的同学们也对这个异…

活动 Web 页面人机识别验证的探索与实践

在电商行业,线上的营销活动特别多。在移动互联网时代,一般为了活动的快速上线和内容的即时更新,大部分的业务场景仍然通过 Web 页面来承载。但由于 Web 页面天生“环境透明”,相较于移动客户端页面在安全性上存在更大的挑战。本文…

利用python提取网站曲线图数据

文章目录数据1数据2数据1 数据目标:曲线图 F12,如图位置输入JSON.stringify(dataSeries.dataPoints) copy,粘贴到data.txt 数据是一个列表,里面是多个字典 编写程序如下: import json as js datafile data1.txt…

论文浅尝 | HEAD-QA: 一个面向复杂推理的医疗保健数据集

论文笔记整理:谭亦鸣,东南大学博士生,研究方向为知识库问答。来源:ACL2019本文构建了一个面向复杂推理任务的多选问答数据集 HEAD-QA,该数据集中的问题来自一个西班牙的医疗保健专业测试,对于具备该方向专业…

Poor Man's BERT: 更小更快的Transformer模型

文 | sliderSun源 | 知乎NLP模型的大小不断增加,随之而来的是可用性降低,TinyBERT,MobileBERT,和DistilBERT都提出了一个独特的知识蒸馏框架,其共同目标是在保持性能的同时减小模型大小。尽管所有这些方法都以各自的方…

LeetCode 429. N叉树的层序遍历(queue)

1. 题目 返回其层序遍历:[[1],[3,2,4],[5,6] ]2. 解题 queue队列解题 /* // Definition for a Node. class Node { public:int val;vector<Node*> children;Node() {}Node(int _val, vector<Node*> _children) {val _val;children _children;} }; */ class Solu…

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

原文地址&#xff1a;http://android.xsoftlab.net/training/basics/activity-lifecycle/recreating.html#RestoreState 有这么几个关于activity通过正常渠道销毁的场景&#xff0c;比如用户按下了返回按钮&#xff0c;又或者是在activity中调用了终止信号finish。系统可能也会…

Java动态追踪技术探究

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

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

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

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

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

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

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

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

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

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

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

LeetCode 669. 修剪二叉搜索树

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

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

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

使用docker部署flask项目

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

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

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

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

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

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按层遍历&#xff0c;每次进入循环记录队列长度n class So…

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

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