Activities介绍

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

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

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

 

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。app

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

 

配置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的资源都被释放。
相关文章
相关标签/搜索