Android Activity

Activity是一种可以包含用户界面的组件,主要用于和用户进行交互。

Activity 的生命周期

返回栈

Android 中的Activity 是可以层叠的。我们每启动一个新的Activity ,就会覆盖在原Activity 之上,然后点击Back 键会销毁最上面的Activity ,下面的 一个Activity 就会重新显示出来。 Android 是使用任务(task )来管理Activity 的,一个任务就是一组存放在栈里的Activity 的集合,这个栈也被称作返回栈(back stack )。

Activity状态

01 . 运行状态

当一个Activity 位于返回栈的栈顶时,Activity 就处于运行状态。

02 . 暂停状态

当一个Activity 不再处于栈顶位置,但仍然可见时,Activity 就进入了暂停状态。你可能会 觉得,既然Activity 已经不在栈顶了,怎么会可见呢?这是因为并不是每一个Activity 都会 占满整个屏幕,比如对话框形式的Activity 只会占用屏幕中间的部分区域。处于暂停状态的 Activity 仍然是完全存活着的

03 . 停止状态

当一个Activity 不再处于栈顶位置,并且完全不可见的时候,就进入了停止状态。

04 . 销毁状态

一个Activity 从返回栈中移除后就变成了销毁状态。

Activity 的生存期

  • onCreate()。这个方法在Activity 第一次被创建的时候调用。你应该在这个方法中完成Activity 的初始化 操作,比如加载布局、绑定事件等。
  • onStart()。这个方法在Activity 由不可见变为可见的时候调用。
  • onResume()。这个方法在Activity 准备好和用户进行交互的时候调用。此时的Activity 一 定位于返回栈的栈顶,并且处于运行状态。
  • onPause()。这个方法在系统准备去启动或者恢复另一个Activity 的时候调用。我们通常 会在这个方法中将一些消耗CPU的资源释放掉,以及保存一些关键数据,但这个方法的执 行速度一定要快,不然会影响到新的栈顶Activity 的使用。
  • onStop()。这个方法在Activity 完全不可见的时候调用。它和onPause()方法的主要区 别在于,如果启动的新Activity 是一个对话框式的Activity ,那么onPause()方法会得到执 行,而onStop()方法并不会执行。
  • onDestroy()。这个方法在Activity 被销毁之前调用,之后Activity 的状态将变为销毁状 态。
  • onRestart()。这个方法在Activity 由停止状态变为运行状态之前调用,也就是Activity 被重新启动了。

以上7个方法中除了onRestart()方法,其他都是两两相对的,从而又可以将Activity 分为以 下3种生存期。

  • 完整生存期。Activity 在onCreate()方法和onDestroy()方法之间所经历的就是完整生存期。一般情况下,一个Activity 会在onCreate()方法中完成各种初始化操作,而在 onDestroy()方法中完成释放内存的操作。
  • 可见生存期。Activity 在onStart()方法和onStop()方法之间所经历的就是可见生存 期。在可见生存期内,Activity 对于用户总是可见的,即便有可能无法和用户进行交互。我们可以通过这两个方法合理地管理那些对用户可见的资源。比如在onStart()方法中对资 源进行加载,而在onStop()方法中对资源进行释放,从而保证处于停止状态的Activity 不会占用过多内存。
  • 前台生存期。Activity 在onResume()方法和onPause()方法之间所经历的就是前台生存期。在前台生存期内,Activity 总是处于运行状态,此时的Activity 是可以和用户进行交互的,我们平时看到和接触最多的就是这个状态下的Activity 。

Android 官方提供了一张Activity 生命周期的示意图

 

 Activity的启动模式

启动模式一共有4种,分别是standard、singleTop 、 singleTask 和singleInstance ,可以在AndroidManifest.xml 中通过给标签指定 android:launchMode属性来选择启动模式。

standard

standard是Activity 默认的启动模式,在standar d模式下,每当启动一个新的Activity ,它就会在返回栈中入栈,并处于栈顶的位置。对于使用standard模式的 Activity ,系统不会在乎这个Activity 是否已经在返回栈中存在,每次启动都会创建一个该 Activity 的新实例。

singleTop

当Activity 的启动模式指 定为singleTop ,在启动Activity 时如果发现返回栈的栈顶已经是该Activity ,则认为可以直接使用它,不会再创建新的Activity 实例。

singleTask

当Activity 的启动模式指定为singleTask ,每次启动该Activity 时, 系统首先会在返回栈中检查是否存在该Activity 的实例,如果发现已经存在则直接使用该实例, 并把在这个Activity 之上的所有其他Activity 统统出栈,如果没有发现就会创建一个新的 Activity 实例。

singleInstance

不同于以上3种启动模式,指定为singleInstance 模式的Activity 会启用一个新 的返回栈来管理这个Activity (其实如果singleTask 模式指定了不同的taskAffinity ,也会启动 一个新的返回栈)。那么这样做有什么意义呢?想象以下场景,假设我们的程序中有一个Activity 是允许其他程序调用的,如果想实现其他程序和我们的程序可以共享这个Activity 的实例,应该如何实现呢?使用前面3种启动模式肯定是做不到的,因为每个应用程序都会有自己的返回栈,同一个Activity 在不同的返回栈中入栈时必然创建了新的实例。而使用 singleInstance 模式就可以解决这个问题,在这种模式下,会有一个单独的返回栈来管理这个 Activity ,不管是哪个应用程序来访问这个Activity ,都共用同一个返回栈,也就解决了共享 Activity 实例的问题。

 

posted @ 2023-01-16 13:52  草木物语  阅读(73)  评论(0编辑  收藏  举报