本文档介绍了活动的概念,然后提供了一些关于如何使用活动的轻量级指导。有关构建应用程序的最佳实践的更多信息,请参见应用程序架构指南。
Activity类是Android应用程序的一个重要组件,而活动的启动和组合方式是平台应用程序模型的一个基本部分。与使用main()方法启动应用程序的编程范例不同,Android系统通过调用对应于其生命周期特定阶段的特定回调方法来启动活动实例中的代码。
一、活动的概念
移动应用程序的体验与桌面应用程序的不同之处在于,用户与应用程序的交互并不总是在同一个地方开始。相反,用户的旅程往往开始于非确定性。例如,如果从主屏幕打开电子邮件应用程序,可能会看到一个电子邮件列表。相比之下,如果你正在使用一个社交媒体应用程序,然后启动你的电子邮件应用程序,你可能会直接进入电子邮件应用程序的屏幕来撰写电子邮件。
Activity类的设计就是为了促进这个范例。当一个应用程序调用另一个应用程序时,调用应用程序调用另一个应用程序中的活动,而不是作为一个原子整体调用应用程序。这样,活动就成为应用程序与用户交互的入口点。您将活动实现为活动类的子类。
活动提供应用程序绘制UI的窗口。这个窗口通常填满屏幕,但是可能比屏幕小,并且浮动在其他窗口的顶部。通常,一个活动在应用程序中实现一个屏幕。例如,应用程序的一个活动可能实现Preferences屏幕,而另一个活动实现Select Photo屏幕。
大多数应用程序包含多个屏幕,这意味着它们包含多个活动。通常,应用程序中的一个活动被指定为主活动,这是用户启动应用程序时出现的第一个屏幕。然后,每个活动可以启动另一个活动,以便执行不同的操作。例如,一个简单的电子邮件应用程序中的主要活动可能提供显示电子邮件收件箱的屏幕。在此基础上,主活动可能启动其他活动,为写电子邮件和打开单独的电子邮件等任务提供屏幕。
虽然活动共同作用在一个应用程序中形成一个有凝聚力的用户体验,但每个活动只是松散地绑定到其他活动;应用程序中的活动之间通常存在最小的依赖关系。事实上,活动常常启动属于其他应用程序的活动。例如,浏览器应用程序可能会启动社交媒体应用程序的共享活动。
要在应用程序中使用活动,您必须在应用程序的清单中注册关于它们的信息,并且必须适当地管理活动生命周期。本文的其余部分将介绍这些主题。
二、配置清单
为了让您的应用程序能够使用活动,您必须在清单中声明活动及其某些属性。
声明Activity
要声明您的活动,请打开清单文件并添加一个元素作为元素的子元素。例如:
<manifest ... >
<application ... >
<activity android:name=".ExampleActivity" />
...
</application ... >
...
</manifest >
此元素唯一需要的属性是android:name,它指定活动的类名。您还可以添加定义活动特征(如标签、图标或UI主题)的属性。有关这些属性和其他属性的更多信息,请参见元素引用文档。
注意:发布应用程序后,不应更改活动名称。如果这样做,可能会破坏一些功能,比如应用程序快捷方式。有关发布后要避免的更改的更多信息,请参见无法更改的内容。
声明intent filters
Intent filters是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>元素声明为默认值使活动能够接收的启动请求。<data>元素指定了该活动可以发送的数据类型。下面的代码片段展示了如何调用上面描述的活动:
// 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启动它们。
有关活动如何响应意图的更多信息,请参见意图和意图过滤器
声明permissions
您可以使用清单的<activity>标记来控制哪些应用程序可以启动特定的活动。父活动不能启动子活动,除非两个活动在其清单中具有相同的权限。如果为父活动声明一个<uses-permission>元素,则每个子活动必须具有一个匹配的<uses-permission>元素。
例如,如果你的应用程序想要使用一个名为SocialApp的假想应用程序在社交媒体上分享一篇文章,SocialApp本身必须定义一个应用程序必须拥有的权限:
<manifest>
<activity android:name="...."
android:permission=”com.google.socialapp.permission.SHARE_POST”/>
</manifest>
然后,要想调用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()。例如,当用户单击Back或Recents按钮时,就会发生这种状态。当系统为您的活动调用onPause()时,从技术上讲,这意味着您的活动仍然部分可见,但大多数情况下,这表示用户正在离开该活动,该活动将很快进入停止或恢复状态。
如果用户希望UI更新,处于暂停状态的活动可以继续更新UI。此类活动的示例包括显示导航地图屏幕或正在播放的媒体播放器。即使这些活动失去了焦点,用户也希望他们的UI继续更新。
不应该使用onPause()保存应用程序或用户数据、进行网络调用或执行数据库事务。有关保存数据的信息,请参见保存和恢复活动状态。
一旦onPause()执行完毕,下一个回调将是onStop()或onResume(),这取决于活动进入暂停状态后发生的情况。
onStop()
当活动不再对用户可见时,系统调用onStop()。这可能是因为正在销毁活动、新活动正在启动或现有活动正在进入恢复状态并覆盖已停止的活动。在所有这些情况下,停止的活动都不再可见。
系统调用的下一个回调是onRestart()(如果活动返回与用户交互),或者onDestroy()(如果该活动完全终止)。
onRestart()
当处于停止状态的活动即将重新启动时,系统将调用此回调。onRestart()恢复活动停止时的状态。
这个回调函数后面总是跟着onStart()。
onDestroy()
系统在销毁活动之前调用此回调。
此回调是活动接收的最后一个回调。通常实现onDestroy()是为了确保在销毁活动或包含活动的进程时释放活动的所有资源。
本节只提供本主题的介绍。有关活动生命周期及其回调的更详细处理,请参见活动生命周期。