活动简介

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() 退出时,活动进入已启动状态,并且活动对用户可见。此回调包含活动进入前台并变为可交互之前的最终准备工作。

onResume()

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

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

onPause()

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

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

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

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

onStop()

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

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

onRestart()

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

此回调之后始终是 onStart()

onDestroy()

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

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

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