Activity

Activity 提供窗口供应用在其中绘制界面。此窗口通常会填满屏幕,但也可能比屏幕小,并浮动在其他窗口上面。

声明 Activity

要使应用能够使用 Activity,必须在清单中声明 Activity 及其特定属性。要声明 Activity,请打开清单文件,并添加 元素作为 元素的子元素。

  1. <manifest ... >
  2. <application ... >
  3. <activity android:name=".ExampleActivity" />
  4. ...
  5. </application ... >
  6. </manifest >

Activity 生命周期

四大组件 - 图1

  • 当 Activity A 启动 Activity B 时,Activity A 会停止,但系统会保留其状态。如果用户在 Activity B 中返回按钮,系统会恢复 Activity A 及其状态。

  • 当用户通过按主屏幕按钮离开任务时,当前 Activity 会停止,其任务会转到后台。系统会保留任务中每个 Activity 的状态。如果用户稍后通过点按该任务的启动器图标来恢复该任务,该任务会进入前台并恢复堆栈顶部的 Activity。

  • 如果用户按返回按钮,当前 Activity 将从堆栈中退出并销毁。堆栈中的上一个 Activity 将恢复。Activity 被销毁后,系统不会保留该 Activity 的状态。

  • Activity 可以多次实例化,甚至是从其他任务对其进行实例化。

Activity 启动模式(LaunchMode)

全部 Activity 都会存储在 Activity 栈中,每次创建一个页面,都会向栈添加,每次销毁一个页面,都从栈弹出。频繁地创建与销毁页面,导致系统产生很大的开销。
在 AndroidManifest 的 Activity 配置中,使用 LaunchMode 属性,设置启动模式,默认Standard。

<activity
    android:name=".TestActivity"
    android:launchMode="singleTop"/>

启动 Activity 的基础命令是 StartActivity (),参数是 Intent,创建 Intent 需要 Context 类与 Activity 的 Class 类。被启动的 Activity 会运行于启动的 Activity 栈,因此启动 Activity 中参数 Intent 的 Context 类,必须使用 Activity 的 Context 启动,不能使用 Application 的 Context。

  - Standard(默认):当前的Activity位于栈顶时,再次启动当前的Activity,会重新创建实例。
  - SingleTop(栈顶复用):只有当 Activity 位于栈顶时,再次启动当前的 Activity ,复用栈顶的 Activity 实例,不会重新创建;如果位于栈内,与 默认的模式相同。
  - SingleTask(栈内复用):只要在栈中存在栈内复用模式的 Activity ,无论是在栈顶还是在栈内,多次调用时都会复用实例,不会重新创建,完全单例模式。在未设置 taskAffinity 属性,任务栈相同时,具有清除其实例顶部的效果;在设置 taskAffinity 属性 ,任务栈不同时,在栈顶复用 和 标准模式下无效。当 taskAffinity 所指定的任务栈不存在时,初次启动栈内复用模式的实例,创建新的任务栈,并将实例放置于其中;被启动 Activity 的任务栈,与启动 Activity 的任务栈相同;当任务栈不同时,启动不同栈内的实例,导致任务栈之间的切换,后台任务栈会位于前台。
  - SingleInstance(单实例):在启动 Activity 实例时,系统会为其创造一个单独的任务栈,以后每次使用时都会使用这个单例,直到其被销毁。当实例位于栈顶时,重复创建,调用 onNewIntent 复用实例;当实例位于栈中时,重复创建同样会复用实例,将单实例模式的任务栈提前。

也可以在 startActivity 的 Intent 中设置启动标志位,以修改启动模式。

intent.addFlags(intent.FLAG_ACTIVITY_NEW_TASK);
  - FLAG_ACTIVITY_SINGLE_TOP    :    栈顶复用。
  - FLAG_ACTIVITY_NEW_TASK    :    栈内复用,单独使用不具备清除顶部效果。
  - FLAG_ACTIVITY_CLEAR_TOP    :    如果是栈内复用的启动模式,会清除栈上其他实例,复用实例,调用 onNewIntent 方法,如果是标准的启动模式,则会清除自己和其他实例,再重新创建,调用 onCreate 。

在设置启动模式时,AndroidManifest 与 startActivity 的 intent 的区别在于:
1. AndroidManifest 只有栈内复用模式有清除顶部的效果;而 startActivity 的 intent 支持设置 FLAG_ACTIVITY_CLEAR_TOP ,并且在标准的启动模式中也可以应用。
2. startActivity 的 intent 无法设置单实例模式。

startActivity 的 intent 的优先级大于 AndroidManifest 的优先级,startActivity 的 intent 会覆盖 AndroidManifest 的效果。

BroadcastReceive

Service

Content Provider