本文内容
- 概述
- Activity 和生命周期
- 演示 Activity 生命周期
- 参考资料
最近研究 Android ,很多东西都需要仔细体会~期间,本来是想看点网上现成的项目加快学习速度,但导入到 eclipse 后,很多代码行都出现问题提示,虽然代码仍可以运行,但说明代码对新版本来说,Android 已经不推荐使用了,而有更合适的解决方案。Android 在发展过程中,每个版本的变化都比较大,这对学习 Android 的障碍比较大,最好的方法也只能去官网下载最新的开发工具,以及演示代码来学习了。
概述
学习任何语言和 IDE,不是会拖放几个控件,就完事了。若想搞好 Android,就要根据之前开发 Web 程序的经验,好好体会它的设计思想。
先从 Activity、View 和 Fragment 开始,它们是很重要的概念,也是 Android 的基类。你可以想想,Java 中的 .jsp 文件和其后台文件,以及 Java 部件;.Net 中的 .aspx 文件及其后台文件,以及 .Net 组件、用户控件等。一个 Web 页面当然可以放很多组件,ASP.NET 所有页面创建时,都会继承 System.Web.UI.Page,而所有控件都继承 System.Web.UI.Control。这类似于 Activity 和 View。你的 Android 页面都可以继承 Activity 类,Android 所有控件都继承 View 类。
如果一个 Web 页面都不在了,页面上的组件也不会存在。也就是说,如果 Activity 不存在了,View 和 Fragment 也不会存在。
HTML 文件,在互联网刚开始时,前端开发人员喜欢用 table 标记为页面布局,但到了现在,人们更喜欢用 DIV 布局。尤其是对现在的 RIA。这有点类似于 Activity 和 Fragment,一个 Activity 可以用在多个 Fragment(片段),一个 Fragment 可以用在多个 Activity 上。
Activity 和生命周期
当用户浏览(无论是使用中,还是退出和返回)你的应用程序时,应用程序的 Activity 实例在其生命周期中会在不同状态之间的过渡。例如,当你的 Activity 第一次启动时,它恢复(Resume)到系统前台,并接受用户焦点(操作)。在此过程中,Android 系统在 Activity 上调用一系列生命周期的方法,这些 Activity 是你建立的用户界面以及其他组件。如果用户执行一个动作,启动另一个 Activity,或切换到另一个应用程序,系统在你 Activity 上会调用另一套生命周期的方法,这样该 Activity 移动到后台(Activity 不再可见,但实例和它的状态保存不变)。
在生命周期回调方法内,你可以声明,当用户离开和重新进入你的 Activity 时,Activity 将如何。例如,如果你构建一个流媒体播放器,当用户切换到另一个应用程序时,你可能要暂停(Pause)视频,终止网络连接。当用户返回时,你要重新连接网络,允许用户从上次看到的地方重新播放。
图 1 生命周期回调方法
实际开发中,我们经常重构的三个方法是 onCreate、onPause 和 onResume。例如,onCreate 经常用于初始化页面;onPause 经常用于保存应用状态,当你正在玩游戏时,有人给你打电话,此时应用程序会自动调用该方法,那么,你就需要保存一下游戏状态,这样听完电话后,可以继续游戏。
演示 Activity 生命周期
在 Android 中文社区发现这个不错的演示,很能说明 Activity。了解 Activity 生命周期的意义在于,Android 虽然与 Web 很相似,但差异也蛮大的,毕竟手机屏幕大小有限。生命周期回调方法,每个 Activity 实例接收,以及如何使用它们,这样的话,你的 Activity 完成了用户所期望的,而不会消耗系统资源。
本实例中,有三个 Activity(Activity A、Activity B 和 Activity C),和对话框(Dialog),当操作其中一个时,另几个会处于何种状态。
下面三组图,是连续操作的。
图 2 左:运行主程序;中:在左图中点击“Start B”;右:在中图中点击“Start C”
Lifecycle Method List 区域表示 Activity 经历的生命周期,Activity Status 区域表示三个 Activity 的当前状态。
注意:当操作其中一个时,另几个会处于何种状态。比如,当运行主程序时,Activity A 先后经历了“创建-开始-恢复”;当在主程序中点击“Start B”时,Activity B 先后经历了“创建-开始-恢复”,而 Activity A 变成了“暂停-恢复-暂停-停止”,此时,Activity B 处于活动状态,A在后台;当再点击“Start C”时,Activity C 处于活动状态,Activity A 和 Activity B 处于后台。
图 3 左:在图 2 右图的基础上,点击“Finish C”;右:接着点击“Finish B”
最终,Activity C 和 Activity B 结束后,都被销毁了,只剩下 Activity A。
图 4 点击“Dialog”
当只剩下 Activity A 时,点击“Dialog”按钮,弹出一个对话框,此时,Activity A 处于暂停状态,当关闭对话框后,Activity A 又会恢复。
最后,若点击“Finish A”,则该程序将完全退出。
该示例,对理解 Activity 很有帮助,具体代码不多说,文后有源代码,下载后看了估计就会明白。
你可以把 Activity 看成是 Web 页面,View 看成 Web 控件,而 Fragment 有点类似于 DIV,对于现在的 RIA 来说,如果你向界面添加一个控件,并用 Firefox 调试,你会发现会有很多 DIV 嵌套,越是够炫的 RIA,DIV 就越多。
Activity、View 和 Fragment 也具有相似性,比如,列表那样的外观和功能,无论是 Activity、View 和 Fragment 都可以实现(它们的相应子类),也就是页面、控件和片段都可以实现列表功能,如果你刚开始做了一个具有列表功能的 Activity,也就是继承了 Activity 基类,但是后来出于性能考虑,觉得用 Fragment,把这个 Fragment 用到多个 Activity 上更合适(新闻列表与新闻的内容),那直接将继承 Activity 基类改成继承 Fragment 基类就行,Android 这样做看似“重复、多余”,其实主要是因为,Android 跟 Web 毕竟场景不同,手机屏幕大小有限,还要考虑性能。
参考资料