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

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

导言

用户通过导航退出或者返回应用的时候,应用中Activity的生命周期会在不同的状态之间变换。举个例子,当Activity初次启动的时候,它会来到系统的前面,然后得到用户焦点。在这个过程中,Android系统会调用Activity的一系列生命周期函数。如果用户执行了启动另一个Activity的动作或是转换到其它APP上了,Android则会调用另一部分的生命周期函数,看起来就像是进入了后台(虽然现在这个Activity是完全不可见状态的,但是它的状态还是会被完整的保存着)。

在生命周期回调函数中,你可以在用户离开或者重新进入Activity时定义Activity的行为。举个例子,如果你正在构建一个流媒体播放器,当用户转换到其它APP时你可能希望暂停视频播放并暂停网络连接,当用户又返回当前的Activity时,你希望重新建立网络连接并在原来的位置继续播放视频。

这节课介绍了每个Activity实例的重要生命周期回调函数的回调及如何使用它们。所以当Activity不再使用它们的时候,Activity需要释放那些不再会重新使用的资源,就像用户所期待的那样。

启动一个Activity

不像其他程序一样,App并不是从main()函数启动的。Android系统在Activity的实例中通过调用指定的回调函数进行启动。这样可以确保它们的生命周期状态保持一致。Activity启动的时候有一列按顺序执行的回调函数,在终结的时候也有一列的按顺序执行的回调函数。

这节课提供了大多数的生命周期函数概要,以及展示在创建一个新的Activity实例时如何处理第一个生命周期函数。

了解生命周期函数

在Activity的生命中,系统会按顺序调用核心的生命周期函数集,类似一个阶梯状的金字塔。正因为这样,Activity的每一个生命周期状态在这个过程都是单独分开的。当系统创建了一个新的Activity实例,每一个回调函数都会移动Activity的状态到前一个的顶部。那么在最顶部的状态便是Activity运行在前台的状态,并且用户可以直接与它交互。

如果用户开始离开这个Activity,系统会调用其它函数来移除刚才的每一个状态,以便逐渐销毁这个Activity。在一些例子中,Activity的状态会移除一部分然后等待(比如用户将其它APP切换到了前面),等待到activity的状态再一次回到顶部(用户回到了这个Activity),恢复用户离开时的状态。下图是简单的生命周期说明示意图:

因为Activity非常复杂,你可能没有必要实现所有的生命周期函数。然而,懂得每一个生命周期函数是很重要的,确保可以通过它们的实现用户所期待的行为方式。可能有几种方式可以通过实现生命周期函数保证APP有良好的行为习惯,包括以下:

  • 当在使用APP时用户接到电话或者转到别的APP上时确保不要崩溃。
  • 当用户不再使用部分资源的时候,请及时释放它。
  • 当用户离开APP然后又返回APP时不要丢失用户的进度,比如输入的文字和看到的视频位置。
  • 当屏幕在水平方向或垂直方向旋转时不要丢失用户进度更不要崩溃。

你将会学习接下来的课程,这里有一些上图所展示的状态,然而,这里只列了3种状态,也就是说,在一个时期内,Activity只是在这3个状态中的一个内。

Resumed
在这个状态下,activity位于前台,并且用户可以直接与它交互。

Paused
在这个状态下,activity被其它Activity掩盖了一部分,其它Activity位于前台,并且是半透明状或者是只掩盖了一部分。在这个状态下,activity不再接收用户输入,不能执行任何代码。

Stopped
在这个状态下,activity完全被隐藏,对用户完全不可见。这里考虑到它位于后台。当停止时,activity的所有状态信息比如成员变量都会被保留,但是不能再执行任何代码。

其它状态(onCreate和onStart)是非常短暂的,系统通过调用下一个生命周期函数会非常顺序的从这个状态移动到下一个状态。所以,在在系统调用了onCreate()方法只会很快的调用onStart(),然后紧接着就是onResume().

这就是最基本的生命周期。现在你将会学习一些特殊的生命周期行为。

指定App的启动Activity

当用户在主屏幕上点击了你应用的图标,系统会启动应用内声明了”launcher”的Activity,并调用该Activity的onCreate方法。这个Activity就是APP呈现给用户的主入口界面。

你可以在Android的清单文件中声明哪一个Activity是APP的主入口界面,AndroidManifest.xml位于工程的根目录内。

APP的主Activity必须在清单文件中以标签< intent-filter>声明,并且需要包含MAIN行为以及LAUNCHER类别:

<activity android:name=".MainActivity" android:label="@string/app_name"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter>
</activity>

Note:当你使用Android SDK工具创建了一个新的Android工程时,这个默认的工程会在清单文件中包含一个以这种过滤声明的Activity。

如果MAIN行为或者LAUNCHER类别没有在应用的其中一个Activity声明的话,那么APP的图标将不会出现在设备的主屏幕应用列表上。

创建一个新的实例

很多APP会包含好几个不同的Activity以便让用户执行不同的行动。当用户点击了APP的启动图标创建了一个主Activity或者是在APP内点击响应按钮启动了别的Activity,系统会通过调用onCreate方法创建每一个Activity的实例。

你必须实现onCreate方法来执行一个最基本的应用启动逻辑,并且应该在Activity的整个生命周期中只执行一次。举个例子,你实现的onCreate()方法应该定义用户界面以及可能要初始化一些类相关变量。

举个例子,下面的这个onCreate的例子展示了一些代码来执行一些基础的设置,比如声明用户界面,定义一些成员变量,然后配置一些UI。

TextView mTextView; // Member variable for text view in the layout
@Override
public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// Set the user interface layout for this Activity// The layout file is defined in the project res/layout/main_activity.xml filesetContentView(R.layout.main_activity);// Initialize member TextView so we can manipulate it latermTextView = (TextView) findViewById(R.id.text_message);// Make sure we're running on Honeycomb or higher to use ActionBar APIsif (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {// For the main activity, make sure the app icon in the action bar// does not behave as a buttonActionBar actionBar = getActionBar();actionBar.setHomeButtonEnabled(false);}
}

Caution:使用SDK_INT预防一些旧的系统运行新的API,这样的话,老系统会发生运行时错误。

onCreate()方法一旦执行完毕,系统会很快的调用onStart和onResume方法。你的系统绝不会驻留在Created状态和Started状态。从技术上将,当onStart方法被调用后activity就变得可见,但是onResume方法会很快的跟着调用,并保持在Resumed状态,直到一些事件将它改变,比如当接到电话,用户转换到了别的APP上,又或者设备的屏幕关闭了。

在下面的其它课程中,你将会见到如何启动其它方法,当activity从Paused或者Stopped状态恢复到Resumed状态时,onStart方法和onResume方法在Activity的生命周期中是非常有用的。

Note: onCreate方法会包含一个名叫savedInstanceState的参数,我们稍后会在有关Recreating an Activity的课程中讨论。

销毁Activity

activity的第一个生命周期函数是onCreate,那么它的最后一个生命周期便是onDestory了。当系统接收到终止信号的时候,将会调用这个方法,然后将activity完成的从系统内存中移除。

大多数的APP不需要实现这个方法,因为本地类引用会随着Activity一起总结,不过Activity的清理工作应该放在onPause下或者onStop下。然而,不过当你在onCreate中启动了一个后台线程或者其它长时间运行的资源,这时如果不适当的清理内存的话,可能会造成内存泄露,你应该在onDestory中杀死或者关闭它们。

@Override
public void onDestroy() {super.onDestroy();  // Always call the superclass// Stop method tracing that the activity started during onCreate()android.os.Debug.stopMethodTracing();
}

Note:在所有的情况下系统调用onDestory方法之后已经调用过onPause方法与onStop方法,不过有一个例外情况:你在onCreate方法中调用了finish方法。在一些例子中,当你的Activity临时决定要启动另一个Activity,你可能要在onCreate方法内调用finish方法来销毁这个Activity,在这种情况下,系统会立即调用onDestory方法,而不会调用其它任何生命周期方法。

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

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

相关文章

论文浅尝 | 利用多语言 wordnet 上随机游走实现双语 embeddings

论文笔记整理&#xff1a;谭亦鸣&#xff0c;东南大学博士生&#xff0c;研究方向为知识图谱问答。来源&#xff1a;Knowledge Based System链接&#xff1a;https://www.sciencedirect.com/science/article/abs/pii/S0950705118301412?via%3Dihub双语word embedding将两种语言…

实践中学到的最重要的机器学习经验!

文 | 微调源 | 知乎问答今天我们讨论一个很有实际意义的问题&#xff1a;你在实践中学到的最重要的机器学习经验是什么&#xff1f;以下回答来自知乎优秀答主微调。1.永远保持怀疑机器学习是最容易得到错误结论的一种解决方案。和编程、做表格、或者纯粹的数学建模不同&#xf…

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

原文地址 : http://android.xsoftlab.net/training/basics/activity-lifecycle/pausing.html 在APP的正常使用过程中&#xff0c;在前台工作的Activity有时可能会被其他的可视化组件挡住&#xff0c;而引起Activity进入Paused状态。举个例子&#xff0c;当一个半透明的Activit…

Leaf:美团分布式ID生成服务开源

Leaf是美团基础研发平台推出的一个分布式ID生成服务&#xff0c;名字取自德国哲学家、数学家莱布尼茨的一句话&#xff1a;“There are no two identical leaves in the world.”Leaf具备高可靠、低延迟、全局唯一等特点。目前已经广泛应用于美团金融、美团外卖、美团酒旅等多个…

LeetCode 658. 找到 K 个最接近的元素(二分查找)

1. 题目 给定一个排序好的数组&#xff0c;两个整数 k 和 x&#xff0c;从数组中找到最靠近 x&#xff08;两数之差最小&#xff09;的 k 个数。返回的结果必须要是按升序排好的。如果有两个数与 x 的差值一样&#xff0c;优先选择数值较小的那个数。 示例 1:输入: [1,2,3,4,…

负数的开方到底等于多少?

文&#xff1a;杨树森知乎编&#xff1a;小鹿鹿lulu负数的开方到底等于多少?举个栗子拿出小本本, 一通变换,得到:Really? 且看下面详解乘方来源于乘法&#xff0c;我们可以归纳地定义&#xff0c;设 是一个域&#xff0c;, 则上述的域 可以是有理数域 , 实数域, 或复数域 前两…

综述 | 知识图谱实体链接:一份“由浅入深”的综述

本文转载自公众号&#xff1a;PaperWeekly。 作者丨Nicolas单位丨追一科技 AI Lab 研究员研究方向丨信息抽取、机器阅读理解本文介绍实体链接&#xff08;Entity Linking&#xff09;这一技术方向&#xff0…

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

原文地址 : http://android.xsoftlab.net/training/basics/activity-lifecycle/stopping.html#Start 在activity的生命周期内&#xff0c;适当的停止和重新启动activity是一个非常重要的过程&#xff0c;它可以确保用户能感觉到APP一直是存活状态&#xff0c;并且不会丢失他们…

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

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

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

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

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

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

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

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

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

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

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;本…