《Android官方开发教程中文版4》由会员分享,可在线阅读,更多相关《Android官方开发教程中文版4(11页珍藏版)》请在金锄头文库上搜索。
1、Android 官方开发教程中文版管理 Activity 的生存周期管理 Activity 的生存周期当用户通过导航离开然后又返回你的 App,App 的 Activity 实例在它们的生存周期内在两个不同的状态之间转换。例如,Activity 首次启动时成为系统的前台并接受用户的关注,在这个过程中,Android 系统在你的 Activity 上调用一系列生命周期方法设置用户界面和其它组件。如果用户执行了一个启动另一个 Activity 或切换到其它 App 的动作,系统调用生命周期的其它方法把 Activity 移到后台(Activity 不再可见,但实例和状态仍然完好无损) 。在生命周期
2、的回调方法中,你可以定义当用户离开和重新进入 Activity 时,Activity 的行为。例如,如果你正在创建一个流媒体视频播放器,当用户切换到其它 App 时,你可以暂停视频并中断网络连接。当用户返回时,你再重新连接网络并允许用户从暂停点恢复播放。本课程解释了重要的生命周期回调方法,每个 Activity 实例接收和如何使用它们,使Activity 执行用户期望的结果,并且当 Activity 不需要它们时,不会消耗系统资源。启动 Activity不像其它编程范例由 main()方法启动,Android 系统在 Activity 中通过调用对应生命周期特定阶段的回调方法来启动代码。在启动
3、 Activity 时有一系列的回调方法,销毁 Activity时也有一系列的回调方法。本节内容提供了大部分重要的生命周期方法的概览,并且展示了在创建 Activity 的新实例时如何处理首个生命周期的回调。理解生命周期回调在 Activity 的生存期内,系统在一个阶梯状金字塔的序列中调用核心的生命周期方法。也就是说,Activity 生命周期的每一个阶段都是这个金字塔上的一个台阶。随着系统创建新的 Activity 实例,每个回调方法都把 Activity 的状态向顶部移动一步,当到达顶部时,Activity 运行在前台并可以和用户交互。当用户开始离开 Activity 时,系统调用其它的
4、回调方法把 Activity 的状态返回到金字塔底部以消除 Activity。在某些情况下,Activity 仅仅移动到金字塔的中间并等待(例如用户切换到其它 App) ,Activity 可以从这里回到顶部(如果用户返回了 Activity)并且从用户离开的地方恢复。根据 Activity 的复杂度,你可能不需要实现所有的生命周期方法。不管怎样,重要的是你要理解每个回调方法并能实现它们,以确保你的 App 表现得如用户期望的那样。正确地实现 Activity 的生命周期方法以确保你的 App 在以下几个方面表现良好,包括: 用户在使用你的 App 时接到电话或切换到其它 App 时,不能崩溃
5、。 用户不再和 App 频繁交互时,不能浪费宝贵的系统资源。 当用户离开 App 并在稍后返回时,不能丢失用户的进程。 当屏幕在水平和垂直方向间切换时,用户的进程不能丢失或崩溃。在接下的课程中你将学习到,Activity 在图一所示的不同状态间转换的几种情况。任何情况下,这些状态中只有三个会静止不变,也就是说,同一时间只能存在以下三个状态中的一个:Resumed这个状态下,Activity 运行在前台,并且用户可以和它交互(有时也被称为“Running”状态) 。Paused这个状态下,Activity 被另一个 Activity 部分遮盖另一个 Activity 运行在前台,并且背景是半透明
6、的或者没有覆盖整个屏幕。暂停的 Activity 不会接收用户输入,也不会执行任何代码。Stopped这个状态下,Activity 完全隐藏并对用户不可见,它被认为处于后台。当停止时,Activity 实例以及它所有的状态信息,如成员变量仍然保持,但不会执行任何代码。其它状态(Create 和 Started)非常短暂,系统通过调用下一个生命周期方法,很快从它们移动到下一个状态。也就是说,系统调用 onCreate()之后,很快调用 onStart(),接着又立即调用 onResume()。这就是 Activity 生命周期的基本知识,现在你要开始学习某些特定的生命周期行为。指定你的 App
7、的启动 Activity当用户从 Home 屏幕上选择你的 App 图标时,系统在 App 内为你声明的“执行” (或图一:用阶梯状金字塔图解 Activity 生命周期。展示了每个回调方法是如何使 Activity 向顶部的 Resume 状态靠近,还有把 Activity 带回到底部的回调方法。Activity 也可以从 Paused和 Stopped 状态回到 Resumed 状态。“主” )Activity 调用 onCreate()方法。这是你的 App 用户界面的主入口点。你可以在 Android 清单文件中声明哪个 Activity 成为你的主Activity, AndroidM
8、anifest.xml 文件在你的项目根目录中。App 的主 Activity 必须在清单文件的 中定义,包含值为 MAIN 的 action 和值为 LAUNCHAR 的 category 属性,如:注 意 : 当 你 使 用 Android SDK 工 具 创 建 Android 项 目 时 , 默 认 的 项 目 文 件 就 包 括 一 个 用这 个 过 滤 器 ( filter) 声 明 在 清 单 文 件 中 的 Activity 类 。如果你所有的 Activity 都没有包含值为 MAIN 的 action 和值为 LAUNCHAR 的 category 属性,那么你的 App
9、图标不会出现在 Home 屏幕的 App 列表中。创建新实例大多数 App 都包含了几个 Activity 以允许执行不同的操作。无论是由用户点击 App 图标时创建的主 Activity,还是你的 App 在响应用户操作时启动的 Activity,系统都会调用onCreate()方法创建 Activity 的实例。你必须实现 onCreate()方法来执行基本的应用程序启动逻辑,这些逻辑在 Activity 的整个生存期内只会发生一次。比如,你的 onCreate()方法应该定义用户界面和实例化某些类变量。下例演示了为 Activity 执行某些基本设置的部分代码,如定义用户界面(在 XML
10、 布局文件中声明) ,声明成员变量以及配置某些 UI。TextView mTextView; / 布 局 中 文 本 视 图 的 成 员 变 量Overridepublic void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);/为 当 前 Activity 设 置 用 户 界 面/ 布 局 文 件 定 义 在 项 目 的 res/layout/main_activity.xml 文 件 中setContentView(R.layout.main_activity);/ 初 始 化 TextVie
11、w 成 员 , 这 样 我 们 可 以 在 后 面 操 作 它mTextView = (TextView) findViewById(R.id.text_message);/ 确 保 我 们 运 行 在 Honeycomb 或 更 高 版 本 下 , 以 便 使 用 操 作 栏 API if (Build.VERSION.SDK_INT = Build.VERSION_CODES.HONEYCOMB) / 对 主 Activity, 确 保 App 的 图 标 在 操 作 栏 中/ 不 要 看 起 来 象 个 按 纽ActionBar actionBar = getActionBar();ac
12、tionBar.setHomeButtonEnabled(false); 警告 :用 SDK_INT 这种方式来防止旧系统执行新的 API 仅在 Android2.0( API 级别 5)或更高版本下有效,旧版本这样做将会产生一个运行时异常。一旦 onCreate()执行完毕,系统会紧接着调用 onStart()和 onResume()方法,你的Activity 永远都不会停留在 Created 或 Started 状态。从技术上说,当调用 onStart()时,Activity 就对用户可见,但 onResume()会紧跟着被调用, Activity 将保持在 Resume 状态直到某些事情
13、改变它。比如收到一个电话,用户导航到其它 Activity,或者设备屏幕关闭。在接下来的课程中,你将看到其它启动方法:onStart()和 onResume()在 Activity 从Paused 和 Stopped 状态中恢复时是如何使用的。注意 : onCreate()方法有一个参数 savedInstanceState,我们将在稍后的课程 “重建Activity”中讨论它。销毁 ActivityActivity 的第一个生命周期回调方法是 onCreate(),最后一个生命周期回调方法是onDestroy()。系统调用 onDestroy()方法标识着你的 Activity 从系统内存中
14、完全移除。大部分 App 不需要实现这个方法,因为本地类的引用会随 Activity 一起被销毁,你的Activity 应该在 onPause()和 onStop()中执行大部分的清理。无论如何,如果你的 Activity 包含了在 onCreate()中创建的后台线程或其它长期资源,没有正确关闭的话可能会造成内存泄漏,你应该在 onDestroy()中终止它们。Overridepublic void onDestroy() super.onDestroy(); / 首 先 调 用 基 类 方 法/停 止 在 onCreate()中 开 始 的 对 方 法 的 跟 踪 android.os.D
15、ebug.stopMethodTracing();图二,另一张 Activity 生命周期结构的图解,当创建 Activity 新实例时,系统按顺序调用三个主要回调方法:onCreate(),onStart()以及 onResume()。一旦这个回调系列的调用完成,Activity 将到达 Resume 状态,用户可以和它交互,直到用户切换到不同的Activity。注意 :系统会在任何情况下调用 onPause()和 onStop()方法后调用 onDestroy(),只有一种情况除外:在 onCreate()方法内调用了 finish()方法。在某些情况下,例如你的 Activity 临时决
16、定启动另一个 Activity,你可以从 onCreate()方法内调用 finish()以销毁 Activity。在这个案例中,系统会在不调用其它任何生命周期方法的情况下立即调用 onDestroy()方法。暂停及恢复 Activity在 App 正常使用的情况下,有时候前台 Activity 会被其它可视组件遮挡从而导致Activity 暂停。比如一个半透明的 Activity(如对话框风格之类的)打开时,之前的 Activity会暂停。虽然这个 Activity 有部分可见,但它当前没有拥有焦点,所以保持在暂停状态。不管怎样,一旦 Activity 被全部遮挡而不可见时,它将停止(我们在下一节中讨论) 。Activity 进入暂停状态时,系统会调用 onPause()方法,以允许你停止正在进行的行为,暂停点(如视频)或任何存留的信息都应该被持久保存以防止用户继续离开你的 App。如果用户从暂停状态返回到 Activity,系统恢复它并调用 onResume()方法。注意 :当 Act