Android Activity|青训营笔记

129 阅读4分钟

这是我参与「第四届青训营」笔记创作活动的第2天。

本文是针对青训营第二课的Android Activity部分完成的青训营笔记。

Activity是Android程序的前台交互、程序入口、布局容器。

1 Activity的基本用法

1)在AndroidManifest.xml中声明,如果不声明,运行时会报错,这是初学者经常遇到的问题。

2)写布局文件,即该Activity对应的layout文件。

3)在Activity中将布局文件绑定。一般是在下文中的onCreate()里完成绑定。

2 Activity的生命周期

onCreate():该生命周期发生在Activity创建时。

onStart():该生命周期表示Activity已经启动,将进入前台。

onResume():该生命周期表示Activity可以与用户交互,此时位于Activity栈顶。

onPause():该生命周期表示Activity焦点已经失去,这时Activity界面是部分可见的。

onStop():该生命周期表示Activity被停止(但还没有被销毁),此时该Activity已经不可见。

onRestart():该生命周期表示Activity被重启,执行完该生命周期后,一般会继续执行onStart()。

onDestroy():该生命周期表示Activity被摧毁。

文档是最权威的资料,关于Activity生命周期,推荐进一步阅读Android官方文档。developer.android.com/guide/compo…

同时,官方提供了Activity生命周期的简化图,如下图所示,也可以和上面的文字描述相对应。

activity_lifecycle.png

Activity生命周期是重要的基础知识,下面的延伸阅读资料有助于更深一步理解,在这里分享推荐。

[译] android应用开发者,你们真的了解Activity的生命周期吗?

juejin.cn/post/684490…

Android全面解析之Activity生命周期

juejin.cn/post/689274…

3 Activity的启动方式

首先介绍任务的概念。根据Android官方文档的定义,

任务是用户在执行某项工作时与之互动的一系列Activity的集合。这些Activity会按照每个Activity打开的顺序排列在一个返回栈中。

栈的方式是后进先出,因此大多数Activity就是这样逐渐排列在返回栈中的,但有时候,需要打破这种默认的方式,这时需要修改Activity的启动方式。

Activity的启动方式可以通过修改清单文件的方法来实现。

Activity的启动方式有4种。他们包括:

"standard":这是默认的启动方式。在该模式中,每启动一个新的Activity,就会创建一个新的实例。所以,在该模式中,一个Activity可以有多个实例。

"singleTop":该模式可以栈顶复用已存在的Activity。即,假设目前收到了一个Intent。如果在当前任务的任务栈顶已经是该Intent对应的Activity,则不会重新创建该Activity的实例,但如果栈顶不是,仍然会新创建一个Activity的实例,此时就和standard类似了。显然,如果该Activity在任务栈中不存在的情况下,也是会和standard类似,新创建一个Activity的实例。所以在这种模式下,也存在一个Activity有多个实例的情况。

在介绍下面两种启动方式之前,需要先介绍android:taskAffinity。

根据Android官方文档,android:taskAffinity可以翻译为任务相似性,具有同一相似性的Activity归属同一任务。任务的相似性由其根Activity的相似性确定。如果未设置该属性,则 Activity 会继承为应用设置的相似性。(请参阅 <application> 元素的 taskAffinity 属性)。

查阅官方文档的application元素的taskAffinity属性:

默认情况下,应用中的所有 Activity 具有相同的Affinity。该Affinity的名称与由 <manifest> 元素设置的软件包名称相同。

接下来继续介绍其余的两种启动模式。

"singleTask":该模式可以栈内复用已存在的Activity。假设目前收到了一个Intent。如果栈中存在该Intent对应的Activity实例,那么不会重新创建该Activity的实例,而是会将该Activity上面的Activity全部出栈,并调用onNewIntent()方法,将这个Intent转到这个现有的实例中。如果不指定android:taskAffinity,根据上文的介绍,默认值是包名,与上面的介绍相同。但如果指定,则会新开启一个Task,该Activity会被启动到新的Task对应的任务栈中。

"singleInstance":该模式中,全局单例,即Activity会单独占用一个Task栈,所以具有全局唯一性。

同时,在学习整理本篇笔记中,注意到Android 12新增了一个"singleInstancePerTask"模式,下面引用官方文档对其的介绍。

此 activity 只能作为任务的根 activity、作为创建该任务的第一个 activity 运行,因此在任务中该 activity 只有一个实例;但是 activity 可以在不同的任务中多次实例化。

4 总结

本笔记目前针对Activity的常见知识点做出了总结与归纳。但Activity仍有可继续深入的知识点。由于目前了解有限,暂时不在本笔记中体现,可以参考站内文章及Android进阶书籍进一步学习。