学习笔记丨四大组件 之 Activity

注:现已有很多文章可供学习,本人的文章也只是学习时的记录,会尽量附上每个知识点的来源,若有遗漏请见谅。

本编会先围绕Activity是什么、为什么、怎么用的角度来介绍Activity。同时会对Activity的生命周期、启动模式、启动流程等Activity相关内容进行介绍。本篇内容目录如下:

  • Activity是什么?
  • 为什么需要Activity?
  • Activity怎么使用?
  • Activity的生命周期
  • Activity的启动模式
  • Activity的启动流程

一、Activity是什么?

Activity是一个Android应用程序的组件。Activity类会创建了一个窗口,开发者可以通过setContentView(View)的接口把UI放到给窗口上。

二、为什么需要Activity?

因为Activity可以提供窗口,且Activity都是独立平等的,所以Activity可以用来处理用户操作。几乎所有的activity都是用来和用户交互的。

三、Activity怎么使用?

step1:新建一个类,并继承AppCompatActivity类或Activity类。与Activity类不同的是,AppCompatActivity默认带标题栏,在v7包,且Android studio的工程也是默认继承AppcompatActivity类。
step2:重写方法onCreate()。
step3:用setContentView()方法设置在该Activity上显示的布局文件。

step4:最后一定要在AndroidManifest配置文件声明该Activity, 如果是主活动需要加上 intent-filter标签。
intent-filter的规则和使用之后会在intent学习中补上。

四、Activity的生命周期

首先,Activity的生命周期分为两种。

  1. 典型情况下的生命周期
  2. 异常情况下的生命周期
  • 典型情况下的生命周期。
  1. onCreate:在首次创建 Activity 时调用。主要用于创建视图、初始化等静态设置。同时,系统向此方法传递一个Bundle 对象,该Bundle 对象记录了Activity上一状态的参数,不过需要在上一次关闭Activity前记录,而后会调用onStart方法。
  2. onStart:即将Activity对用户可见但不能交互,因为还没获取到焦点。
  3. onResume:在 Activity 即将开始与用户进行交互之前调用。 此时,Activity 处于 Activity 堆栈的顶层,并具有用户输入焦点。
  4. onPause:停止Activity与用户的交互,失去焦点。 此方法通常用于对持久性数据的保存、停止动画以及其他可能消耗 CPU 等内容。
  5. onStop:在 Activity 对用户不再可见时调用。而后如果 Activity 恢复与用户的交互,则会调用 onRestart 方法,如果 Activity 被销毁,则会调用onDestroy方法。
  6. onRestart:在Activity被停止后再次启动时调用(即屏幕熄灭后再次回到app,按下home键后再次回到app),而后会调用onStart方法。
  7. onDestroy:在 Activity 被销毁前调用,这是 Activity 收到的最后调用。 当 Activity 结束(对 Activity 调用了 finish 方法),或系统为节省空间而暂时销毁该 Activity 实例时,可能会调用它。 你可以通过 isFinishing和isDestroy() 方法区分这两种情形。
  • 异常情况下的生命周期。 (Activity被销毁重建或Activity重新打开)
  1. onSaveInstanceState:当某项Activity被销毁时,Activity 对象也会被销毁,为了让用户并对系统销毁后又重建的Activity无感知。 你可以在onSaveInstanceState方法对有关Activity状态的信息进行保存,以确保有关Activity状态的重要信息得到保留。

调用时机:当用户按下HOME键时、长按HOME键,选择运行其他的程序时、按下电源按键(关闭屏幕显示)时、从activity A中启动一个新的activity时、屏幕方向切换时,例如从竖屏切换到横屏时。

  1. onRestoreInstanceState 或者 onCreate:系统会先调用onSaveInstanceState方法,然后销毁 Activity。系统会向该方法传递一个Bundle 对象,你可以在其中使用putString 和 putInt 等方法以键-值对形式保存有关 Activity 状态的信息。然后,如果系统终止您的应用进程,并且用户返回您的 Activity,则系统会重建该 Activity,并将Bundle同时传递给onCreate和onRestoreInstanceState。您可以使用上述任一方法从Bundle 提取您保存的状态并恢复该 Activity 状态。如果没有状态信息需要恢复,则传递给您的Bundle是空值(如果是首次创建该 Activity,就会出现这种情况)。

解析流程图:可以看到,从Activity running开始走,Activity 重获用户焦点时可保持状态完好。恢复数据的方式跟随生命周期的不同有两种情况。

  • 系统在销毁 Activity 后重建 Activity,Activity 必须恢复之前保存的状态。
  • 系统停止 Activity 后继续执行 Activity,并且 Activity 状态保持完好。

参考资料与详解:
Android Activity生命周期详解

Activity的启动模式

  • 首先,先给大家介绍一下任务栈是什么?

任务栈是一个Activity的集合,它使用栈的方式来管理其中的Activity,这个栈又被称为返回栈(back stack),栈中Activity的顺序就是按照它们被打开的顺序依次存放的。

  • 启动模式

standard(默认启动模式)
standard是默认的启动模式,即如果不指定launchMode属性,则自动就会使用这种启动模式。这种启动模式表示每次启动该Activity时系统都会为创建一个新的实例,并且总会把它放入到当前的任务当中。声明成这种启动模式的Activity可以被实例化多次,一个任务栈当中也可以包含多个这种Activity的实例。

singleTop
在这种启动模式下,如果要启动的这个Activity在当前任务中已经存在了,并且还处于栈顶的位置,那么系统就不会再去创建一个该Activity的实例,而是调用栈顶Activity的onNewIntent()方法。如果不在栈顶则创建一个该Activity的实例,因此声明成这种启动模式的Activity也可以被实例化多次,一个任务当中也可以包含多个这种Activity的实例。

singleTask
在这种启动模式下,如果现有任务当中已经存在一个该Activity的实例了,那么系统就不会再创建一次它的实例,而是会直接调用它的onNewIntent()方法(会将该任务栈的该activity之上的所有activity全部弹出栈)。声明成这种启动模式的Activity,在同一个任务当中只会存在一个实例。

singleInstance
在这种启动模式下,若还没有该Activity实例则会创建一个新的任务栈,将该Activity实例单独放在任务栈中,且此任务栈中只有唯一一个实例。

  • 如何定义启动模式

1.使用manifest文件

当你在manifest文件中声明一个Activity的时候,你可以指定这个Activity在启动的时候该如何与任务进行关联。

2.使用Intent flag

当你调用startActivity()方法时,你可以在Intent中加入一个flag,从而指定新启动的Activity该如何与当前任务进行关联。

参考资料与详解:
Android任务栈的完全解析

Activity的启动流程

你可能感兴趣的:(学习笔记丨四大组件 之 Activity)