Android官方开发教程中文版(四).docx





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

限制150内