activity 简介

Activity 类是 Android 组件的重要组成部分, 而 activity 启动和组合的方式也是一项 是平台应用模型的一部分。与 GCP 上的编程范式不同 哪些应用使用 main() 方法启动,Android 系统会通过以下方式在 Activity 实例中启动代码: 调用与 其生命周期。

本文档介绍了 activity 的概念,然后提供一些 有关如何使用这些技术的简要指南。 如需详细了解有关应用架构的最佳实践, 请参阅 应用架构指南

Activity 的概念

移动应用体验与桌面设备体验的不同之处在于 用户与应用的互动并非总是从同一个位置开始。 相反,用户体验历程的开始往往是不确定的。 例如,如果您从主屏幕打开电子邮件应用,可能会看到 电子邮件列表。相比之下,如果你使用的是社交媒体应用 启动电子邮件应用后,您可以直接进入电子邮件应用的屏幕 撰写电子邮件。

Activity 类旨在促进这种范式。 当一个应用调用另一个应用时,发起调用的应用会调用另一个中的 activity 而不是将整个应用视为原子整体。这样,activity 就会充当 是应用与用户互动的入口点。您将实现 activity 作为 Activity 类的子类来实现。

activity 提供供应用进行绘制的窗口 界面此窗口通常会填满整个屏幕,但可能会小于 并浮动在其他窗口的上方。一般情况下,一个活动 在应用中实现一个屏幕例如,应用的某个 activity 可以 实现一个 Preferences 屏幕,而另一个 activity 实现了 选择照片屏幕。

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

尽管 activity 通过协同工作,在 应用,每个 activity 仅松散绑定到其他 activity;你有 通常是指应用中 activity 之间的依赖关系非常小。事实上 activity 通常会启动属于其他应用的 activity。例如: 浏览器应用可能会启动社交媒体应用的分享 activity。

如需在应用中使用 activity,您必须在 并且您必须适当地管理 activity 生命周期。 本文档的其余部分将介绍这些主题。

配置清单

为了让您的应用能够使用 activity,您必须声明 activity, 以及它们的某些属性

声明 Activity

要声明 Activity,请打开清单文件并添加一个 <活动> 元素作为 <应用> 元素。例如:

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

此元素的唯一必需属性是 android:name、 ,用于指定 activity 的类名称。您还可以添加属性 ,用于定义标签、图标或界面主题等 activity 特征。 有关这些属性和其他属性的详情,请参阅 <活动> 元素参考文档。

注意 :发布应用后, 您不应更改活动 名称。否则可能会破坏某些功能,例如应用快捷方式。 如需详细了解发布后应避免的更改,请参阅 <ph type="x-smartling-placeholder"></ph> 无法改变的事情

声明 intent 过滤器

intent 过滤器 是 Android 平台的一项非常强大的功能他们 提供的 activity 不仅能够基于 显式请求,也可以是隐式请求。例如: 一个显式请求可能会告诉系统“启动‘Send Email Activity’” “在 Gmail 应用中”。而隐式请求则会告知 在任何时候打开“发送电子邮件”屏幕 能够完成这项工作的活动。”系统界面询问用户使用哪个应用时 这就是 intent 过滤器在发挥作用。

要使用此功能,您可以在 <intent-filter> 属性(在 中) <activity> 元素一起使用。此元素的定义包括 <action> 元素,并且 (可选) <类别> 元素和/或 <data> 元素。这些元素 可指定 activity 可响应的 intent 类型。对于 以下代码段展示了如何配置 发送文本数据,并接收来自其他 Activity 执行此操作的请求:

<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> 元素指定此 Activity 发送数据。 声明 <category> 元素,因为 DEFAULT 会启用 activity 接收启动请求<data> 指定数据的类型 此 activity 可以发送的内容。以下代码段展示了如何调用 上述活动:

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);
如果您打算让应用保持独立,不允许其他应用激活 你不需要 需要任何其他 intent 过滤器。您不想进行的活动 不应包含任何 intent 过滤器,并且可以 使用显式 intent 自行启动它们。如需详细了解 请参阅 intent 和 Intent 过滤器

声明权限

您可以使用清单的 <ph type="x-smartling-placeholder"></ph> 要控制的 <activity> 代码 哪些应用可以启动特定的 activity。父 activity 无法启动 子级 activity 的子 activity(除非这两个 activity 在其各自的 activity 中拥有相同的权限) 清单。如果您声明 <ph type="x-smartling-placeholder"></ph> <uses-permission> 元素,每个子 activity 都必须有一个匹配的 <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>

如需关于权限和安全性的更多信息,请参阅 安全与权限

管理 Activity 生命周期

一个 activity 在其生命周期中会经历多种状态。 您可以使用一系列回调来处理状态之间的转换。以下部分 引入这些回调。

onCreate()

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

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

onStart()

onCreate() 退出时,activity 进入“已开始”状态,且用户可以看到相应的 activity。 此回调包含 Activity 对 Activity 的最终准备工作, 进入前台并具有互动性。

onResume()

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

onPause() 回调始终 关注onResume()

onPause()

当 activity 丢失时,系统会调用 onPause() 并进入“已暂停”状态例如,如果用户将 “返回”或“最近使用的应用”按钮。当系统调用 为您的活动记录onPause(), 从技术层面来讲,这表明你的活动仍然处于部分可见状态,但通常情况下,这表明你的活动仍然处于部分可见状态 当用户离开 activity 时,activity 很快就会进入 “已停止”或“已恢复”状态。

处于“已暂停”状态的 activity 可以继续更新界面, 预期界面进行更新。此类 activity 的示例包括显示导航的 activity 地图屏幕或媒体播放器。即使此类 activity 失去焦点,用户 预期其界面会继续更新。

应该使用 onPause(),用于保存应用或用户 数据、进行网络调用或执行数据库事务。 有关保存数据的信息,请参阅 保存和恢复 activity 状态

onPause() 执行完毕后, 下一个回调是 onStop()onResume(),具体取决于 在 activity 进入“已暂停”状态后发生。

onStop()

系统会在发生以下情况时调用 onStop(): 活动对用户不再可见。 发生这种情况可能是因为 activity 被销毁,一个新的 activity 或现有活动进入 “已恢复”状态且包含已停止的 activity。 在所有这些情况下,已停止的 activity 都不会再 完全可见

系统调用的下一个回调是 onRestart()(如果 再次与用户进行互动 onDestroy() 如果此活动将完全终止。

onRestart()

当处于“已停止”状态的 activity 出现以下情况时,系统会调用此回调 即将重启。onRestart() 从 Activity 停止时的状态恢复 Activity。

该回调后面始终跟有 onStart()

onDestroy()

系统会在销毁 activity 之前调用此回调。

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

本部分只是简要地介绍了该主题。有关 activity 生命周期及其回调的详细介绍, 请参阅活动 Lifecycle