Activity总结

Activity—Developer官网介绍

public class Activity
extends ContextThemeWrapper implements LayoutInflater.Factory2, Window.Callback, KeyEvent.Callback, View.OnCreateContextMenuListener, ComponentCallbacks2

java.lang.Object
android.content.Context
android.content.ContextWrapper
android.view.ContextThemeWrapper
android.app.Activity

Known Direct Subclasses
AccountAuthenticatorActivity, ActivityGroup, AliasActivity, ExpandableListActivity, FragmentActivity, ListActivity, NativeActivity

Known Indirect Subclasses
AppCompatActivity, LauncherActivity, PreferenceActivity, TabActivity

1. 返回栈

Android 用任务(Task)来管理 Activity,一个任务就是一组存放在栈里的 Activity 的集合,这个栈被称作返回栈(Back Stack)。

2. Activity的状态

Activity 在其生命周期中最多可能会有4种状态

1). 运行状态

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

2). 暂停状态

当一个 Activity 不再位于栈顶,但仍然可见,这时 Activity 就进入了暂停状态

3). 停止状态

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

4). 销毁状态

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

3. Activity的生命周期

Activity 类中定义了7个回调方法,覆盖了 Activity 生命周期的每一个环节。

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

3.1 Activity的生存期

  • 完整生存期:在 onCreate() 方法和 onDestroy() 方法之间。
  • 可见生存期:在 onStart() 方法和 onStop() 方法之间。
    在可见生存期内,Activity 对于用户来说是可见的,即便有可能无法和用户进行交互。
  • 前台生存期:在 onResume() 方法和 onPause() 方法之间。
    在前台生存期内,Activity 总是处于运行状态的,此时的 Activity 是可以和用户进行交互的。我们平时看到和接触最多的也就是这个状态下的 Activity。

3.2 小结

判断 Activity 状态的2个关键:

  1. 是否可见
  2. 是否在返回栈的栈顶

4. Activity的启动模式

启动模式一共有4种,分别是 standard、singleTop、singleTask 和 singleInstance。
可以在 AndroidManifest.xml 中通过给 标签指定 android:launchMode 属性来选择启动模式。
在实际开发中,应该根据特定的需求为每个 Activity 指定恰当的启动模式。

1). standard

standard 是 Activity 默认的启动模式

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

2). singleTop

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

3). singleTask

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

4). singleInstance

不同于以上3种启动模式,指定为 singleInstance 模式的 Activity 会启用一个新的返回栈来管理这个 Activity(在 singleTask 模式下,指定不同的 taskAffinity,也会启动一个新的返回栈)。

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

你可能感兴趣的:(Activity总结)