活动简介

Activity 类是 Android 应用的关键组件,活动启动和组合的方式是平台应用程序模型的基础部分。与通过 main() 方法启动应用的编程范例不同,Android 系统通过调用对应于其生命周期特定阶段的特定回调方法,在 Activity 实例中启动代码。

本文档介绍了活动的概念,然后提供了有关如何使用活动的一些简要指南。有关应用架构最佳实践的更多信息,请参阅 应用架构指南

活动的概念

移动应用体验与其桌面对应体验的不同之处在于,用户与应用的交互并不总是从同一位置开始。相反,用户旅程通常是非确定性地开始的。例如,如果您从主屏幕打开电子邮件应用,则可能会看到电子邮件列表。相反,如果您正在使用社交媒体应用,然后该应用启动您的电子邮件应用,则您可能会直接转到电子邮件应用的撰写电子邮件屏幕。

Activity 类旨在促进这种范式。当一个应用调用另一个应用时,调用应用会调用另一个应用中的活动,而不是将应用作为一个整体。这样,活动就成为应用与用户交互的入口点。您可以将活动实现为 Activity 类的子类。

活动提供应用在其上绘制 UI 的窗口。此窗口通常填充整个屏幕,但也可能小于屏幕并浮动在其他窗口的顶部。通常,一个活动在一个应用中实现一个屏幕。例如,应用的活动之一可能实现“首选项”屏幕,而另一个活动实现“选择照片”屏幕。

大多数应用包含多个屏幕,这意味着它们包含多个活动。通常,应用中的一个活动被指定为主活动,它是用户启动应用时显示的第一个屏幕。然后,每个活动都可以启动另一个活动以执行不同的操作。例如,简单的电子邮件应用中的主活动可能会提供显示电子邮件收件箱的屏幕。从那里,主活动可能会启动其他活动,这些活动提供用于撰写电子邮件和打开单个电子邮件等任务的屏幕。

尽管活动协同工作以在应用中形成连贯的用户体验,但每个活动都只是松散地绑定到其他活动;应用中的活动之间通常依赖关系很少。实际上,活动通常会启动属于其他应用的活动。例如,浏览器应用可能会启动社交媒体应用的“共享”活动。

要在您的应用中使用活动,您必须在应用的清单中注册有关活动的信息,并且必须适当地管理活动生命周期。本文档的其余部分介绍了这些主题。

配置清单

为了使您的应用能够使用活动,您必须在清单中声明活动及其某些属性。

声明活动

要声明您的活动,请打开清单文件并在 <activity> 元素作为 <application> 元素的子元素添加。例如

<manifest ... >
  <application ... >
      <activity android:name=".ExampleActivity" />
      ...
  </application ... >
  ...
</manifest >

此元素唯一必需的属性是 android:name,它指定活动的类名。您还可以添加定义活动特征(如标签、图标或 UI 主题)的属性。有关这些和其他属性的更多信息,请参阅 <activity> 元素参考文档。

注意:发布应用后,不应更改活动名称。如果这样做,可能会破坏某些功能,例如应用快捷方式。有关发布后应避免更改的更多信息,请参阅 不可更改的事项

声明意图过滤器

意图过滤器 是 Android 平台的一项非常强大的功能。它们不仅能够基于显式请求,还能基于隐式请求启动活动。例如,显式请求可能会告诉系统“在 Gmail 应用中启动发送电子邮件活动”。相比之下,隐式请求会告诉系统“在任何可以执行此操作的活动中启动发送电子邮件屏幕”。当系统 UI 询问用户在执行任务时使用哪个应用时,那就是意图过滤器在起作用。

您可以通过在 <activity> 元素中声明 <intent-filter> 属性来利用此功能。此元素的定义包括一个 <action> 元素,以及可选的 <category> 元素和/或 <data> 元素。这些元素结合起来指定了您的活动可以响应的意图类型。例如,以下代码片段显示了如何配置发送文本数据并接收来自其他活动的请求以执行此操作的活动

<activity android:name=".ExampleActivity" android:icon="@drawable/app_icon">
    <intent-filter>
        <action android:name="android.intent.action.SEND" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="text/plain" />
    </intent-filter>
</activity>

在此示例中,<action> 元素指定此活动发送数据。将 <category> 元素声明为 DEFAULT 使活动能够接收启动请求。 <data> 元素指定此活动可以发送的数据类型。以下代码片段显示了如何调用上面描述的活动

Kotlin

val sendIntent = Intent().apply {
    action = Intent.ACTION_SEND
    type = "text/plain"
    putExtra(Intent.EXTRA_TEXT, textMessage)
}
startActivity(sendIntent)

Java

// Create the text message with a string
Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.setType("text/plain");
sendIntent.putExtra(Intent.EXTRA_TEXT, textMessage);
// Start the activity
startActivity(sendIntent);
如果您希望您的应用自包含并且不允许其他应用激活其活动,则不需要任何其他意图过滤器。您不希望提供给其他应用程序的活动不应有任何意图过滤器,您可以使用显式意图自己启动它们。有关您的活动如何响应意图的更多信息,请参阅 意图和意图过滤器

声明权限

您可以使用清单的 <activity> 标签来控制哪些应用可以启动特定活动。父活动无法启动子活动,除非这两个活动在其清单中具有相同的权限。如果您为父活动声明了 <uses-permission> 元素,则每个子活动都必须具有匹配的 <uses-permission> 元素。

例如,如果您的应用想要使用名为 SocialApp 的假设应用在社交媒体上分享帖子,则 SocialApp 本身必须定义调用它的应用必须具有的权限

<manifest>
<activity android:name="...."
   android:permission=”com.google.socialapp.permission.SHARE_POST”

/>

然后,要被允许调用 SocialApp,您的应用必须与 SocialApp 清单中设置的权限匹配

<manifest>
   <uses-permission android:name="com.google.socialapp.permission.SHARE_POST" />
</manifest>

有关权限和安全性的更多信息,请参阅 安全性和权限

管理活动生命周期

在活动的生命周期中,它会经历许多状态。您使用一系列回调来处理状态之间的转换。以下部分介绍了这些回调。

onCreate()

您必须实现此回调,当系统创建您的活动时,它会触发。您的实现应该初始化活动的必要组件:例如,您的应用应该在此处创建视图并将数据绑定到列表。最重要的是,您必须在此处调用 setContentView() 以定义活动用户界面的布局。

onCreate() 完成后,下一个回调始终是 onStart()

onStart()

onCreate() 退出时,活动进入 Started 状态,并且活动对用户可见。此回调包含活动进入前台并变得可交互之前的最终准备工作。

onResume()

当活动开始与用户交互之前,系统会调用此回调。此时,活动位于活动堆栈的顶部,并捕获所有用户输入。大多数应用的核心功能都在 onResume() 方法中实现。

onPause() 回调始终跟随 onResume()

onPause()

当活动失去焦点并进入 Paused 状态时,系统会调用 onPause()。例如,当用户点击“后退”或“最近使用的应用”按钮时,就会发生这种情况。当系统为您的活动调用 onPause() 时,从技术上讲意味着您的活动仍然部分可见,但大多数情况下表示用户正在离开活动,并且活动很快将进入 Stopped 或 Resumed 状态。

如果用户期望 UI 更新,则处于 Paused 状态的活动可能会继续更新 UI。此类活动的示例包括显示导航地图屏幕或播放媒体播放器的活动。即使此类活动失去焦点,用户也期望其 UI 继续更新。

不应使用 onPause() 保存应用程序或用户数据、进行网络调用或执行数据库事务。有关保存数据的更多信息,请参阅 保存和恢复活动状态

onPause() 完成执行后,下一个回调是 onStop()onResume(),具体取决于活动进入 Paused 状态后发生的情况。

onStop()

当活动不再对用户可见时,系统会调用 onStop()。这可能是因为活动正在被销毁、新的活动正在启动或现有的活动正在进入 Resumed 状态并覆盖已停止的活动。在所有这些情况下,已停止的活动都完全不可见了。

系统调用的下一个回调是 onRestart()(如果活动即将返回与用户交互),或者 onDestroy()(如果此活动完全终止)。

onRestart()

当处于 Stopped 状态的活动即将重新启动时,系统会调用此回调。 onRestart() 会从其停止时恢复活动的状态。

此回调始终后跟 onStart()

onDestroy()

在活动被销毁之前,系统会调用此回调。

此回调是活动接收到的最后一个回调。 onDestroy() 通常用于确保在活动或包含它的进程被销毁时释放活动的所有资源。

本节仅对本主题进行了介绍。有关活动生命周期及其回调的更详细处理,请参阅 活动生命周期