Activities介绍

https://developer.android.google.cn/guide/components/activities/intro-activities.html#java --翻译水平有限,欢迎指正

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

这个文档介绍了Activity的概念,然后提供了一些关于如何使用它们的轻量级指导。

 

activities概念


  移动应用程序体验与桌面应用程序体验不同之处在于用户与移动应用程序的交互并不总是在同一个地方开始。相反,用户的旅程通常是不确定的。例如,如果你从主屏幕打开一个电子邮件应用程序,你可能会看到一个电子邮件列表。相比之下,如果你使用的是社交媒体应用程序,然后启动你的电子邮件应用程序,你可能会直接进入电子邮件应用程序用来撰写电子邮件的屏幕。

Activity类的设计目的是为了实现这个模式。当一个应用程序调用另一个应用程序时,调用应用程序会调用另一个应用程序中的某个activity,而不是作为一个原子整体来调用应用程序。这样,activity就成为应用程序与用户交互的入口点。实现activity类的子类来获得activity。

activity提供了应用程序绘制UI的窗口。这个窗口通常会填充屏幕,但可能比屏幕小,并在其他窗口上浮动。通常,一个activity在应用程序中实现一个屏幕,例如,一个应用程序的一个activity可能实现一个偏好屏幕,而另一个activity实现一个选择的照片屏幕。

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

虽然activity可以在应用程序中形成聚合的用户体验,但每个activity都只是松散地绑定到其他activity;在应用程序中,activity之间的依赖性通常是最小的,实际上,activity通常会启动属于其他应用程序的activity。例如,一个浏览器应用程序可能启动社交媒体应用程序的共享activity。

要在应用程序中使用activity,必须在应用程序的manifest中注册信息,并且必须适当地管理activity的生命周期。本文的其余部分将介绍这些主题。

 

配置manifest


 声明activities

要声明您的activity,请打开您的manifest文件,并添加一个 <activity> 元素作为 <application> 元素的子元素。例如: 

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

  这个元素唯一需要的属性是android:name,它指定activity的类名。您还可以添加定义activity特性的属性,如标签、图标或UI主题。

    发布应用程序后,不应该更改activity名称。如果这样做,可能会破坏一些功能,比如应用程序快捷键

声明intent filters

intent filters是Android平台的一个非常强大的特性。它们提供了基于明确的请求和隐式请求启动activity的能力。例如,一个明确的请求可能会告诉系统“在Gmail应用程序中启动发送邮件activity”。相比之下,当系统UI询问用户在执行任务时使用哪个应用程序时,隐式请求告诉系统“在任何可以完成任务的activity中启动发送电子邮件屏幕”。这就是intent filters在起作用。

通过在 <activity>元素中声明 <intent-filter>属性,您可以利用这个特性。该元素的定义包括<action>元素和,可选地一个<category> 元素和/或 <data> 元素。这些元素结合在一起,指定您的activity可以响应的intent类型。例如,下面的代码片段展示了如何配置发送文本数据的activity,并接收来自其他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可以发送的数据类型。下面的代码片段展示了如何调用上面描述的activity:

// 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,你不需要任何其他 intent filters。您不希望向其他应用程序提供的activity应该没有intent filters,您可以使用明确的 intents来启动它们。

声明permissions(权限)

您可以使用manifest的 <activity>标记来控制哪些应用程序可以启动特定的activity。除非两个activity在其manifest中具有相同的权限,否则父activity不能启动子activity。如果您为特定的activity声明一个 <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声明周期中,一个activity要经过若干状态。您使用一系列回调来处理状态间的转换。下面的部分将介绍这些回调。

onCreate()

您必须实现这个回调,该回调在系统创建activity时触发。您的实现应该初始化activity的基本组件:例如,应用程序应该创建视图并将数据绑定到这里的列表。最重要的是,在这里必须调用setContentView()来定义activity的用户界面的布局。

当onCreate()完成时,下一个回调总是onStart()。

 onStart()

当onCreate()退出时,activity进入Started状态,activity对用户可见。这个回调包含了activity用于进入前台并进行交互的最后准备工作。

onResume()

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

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

onPause()

 当activity失去焦点并进入Paused 状态时,系统调用onPause()。例如,当用户点击Back或Recents按钮时,就会出现这种状态。当系统为您的activity调用onPause()时,技术上意味着您的activity仍然部分可见,但大多数情况下是指用户将离开activity,activity将很快进入Stopped状态或Resumed状态。

 如果用户期望UI更新, Paused 状态中的activity可能会继续更新UI。此类activity的示例包括显示导航地图屏幕或播放媒体播放器。即使这样的activity失去了焦点,用户也希望他们的UI能够继续更新。

 您不应该使用onPause()来保存应用程序或用户数据、进行网络调用或执行数据库事务。

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

 onStop()

当activity不再对用户可见时,系统调用onStop()。这可能会发生,因为activity正在被销毁,一个新的activity正在启动,或者一个现有的activity正在进入一个 Resumed 状态,并且正在覆盖停止的activity。在所有这些情况下,停止的activity都不再可见。

如果该activity返回与用户交互,系统调用的下一个回调是onRestart(),或者如果该activity完全终止,则是onDestroy(),

 onRestart()

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

 这个回调总是紧接着onStart()。

onDestroy()

系统在activity被销毁之前调用这个回调。

 这个回调是activity接收到的最后一个回调。onDestroy()通常用以确保当activity或包含该activity的进程被销毁时,所有activity的资源都被释放。

 

posted @ 2018-03-14 15:06  caroline2016  阅读(1360)  评论(0编辑  收藏  举报