当前位置: 首页 > 科技观察

安卓概念漫游第三夜

时间:2023-03-21 23:16:55 科技观察

拿起手机,屏幕上总是布满了应用图标。点击图标,选择应用,玩游戏,刷微博,写日记。“叮咚”一声,邮件APP提示有新邮件。在Android中,琳琅满目的应用程序承载着各种有趣的功能。欢迎来到Android应用程序的世界。每个应用程序都是存储在手机中的一个小程序。编写这个小程序是每个Android开发者的主要工作。程序运行成为进程后,在进程的内存空间中创建一个新的Dalvik虚拟机。程序预设的各种视觉效果和功能都会在这个虚拟机中进行。Android应用程序就像一支小军队,也需要不同功能的部队通力合作。活动步兵是军团的基石。很多时候在使用手机的时候,都会停留在某个“页面”上,比如和爱人的对话页面、切水果页面、拍照查看页面等。在Android术语中,一个页面就是一个Activity,它是一个占据整个屏幕的界面。用户和手机可以通过Activity进行通信。页面,或者说Activity,在移动应用中是一个很常见的概念,以至于用户有时会忽略它们的存在,就像那些非常普通的小步兵。查看这些页面,我们可以找到一些共性。活动包含一些特殊的视觉元素,例如垂直列表、彩色背景或小按钮。Activity呈现各种信息,例如图片、文本、输入字段等。除了静态信息,Activity还可以播放动态动画或视频。用户可以与Activity进行交互,输入信息,点击按钮,上下滑动,Activity会根据这些交互动作触发特定的效果。一个应用程序通常包含多个页面。在某些情况下,我们会离开当前的Activity,激活并转到下一个Activity。在联系人入口菜单页面,点击联系人进入新页面,页面包含联系人的具体信息;然后点击返回按钮,我们退出具体信息页面,返回到联系人入口菜单页面。在应用程序的进程空间中有一个栈,用来记录我们依次激活的活动。新激活的Activity被压入栈顶。在手机屏幕上,我们只能看到栈顶的Activity,我们也只能和这个Activity进行交互。当我们点击返回键时,当前Activity结束,从栈中弹出。最后激活的Activity出现在栈顶,再次占据手机屏幕。这就是为什么我们按返回键可以回到历史页面(联系人入口菜单)的原因。就像默默守护的小步兵一样,Activity始终处于运行、暂停、停止等相对静止的状态,Activity的很多功能都是在状态切换中完成的。状态转换期间执行的命令由程序员预先设置并包含在特定方法中。例如,一个Activity从非活动状态到运行状态的过程中,会自动执行Activity对象的onStart()方法。在这个方法中,Android程序员设计了Activity在目标状态下的效果:实现特定的页面布局、为按钮注册回调函数、上网获取信息等。再比如,当Activity处于暂停和恢复状态时,会执行onRestart()方法。Android程序员可以在该方法中实现调节亮度、弹出提示等功能。这就好比平时士兵在训练的时候,预设了切换过程中要做什么。小兵从一种状态进入另一种状态,例如从“警报”到“准备开火”。在此状态下,士兵执行一个预设动作,即装子弹,然后进入射击待命状态。有趣的是,AndroidActivity与Internet上的网页非常相似。它们是充满屏幕的页面,包含视觉元素和信息。用户可以通过此类页面实现某些功能。甚至这些接口的编写方式也大同小异:Android使用XML来设计页面,而Web使用HTML来设计页面。您甚至可以将应用程序直接视为包含多个页面的小型网站。运用得当,骑兵是战场上的利剑。AndroidLegion的另一个重要部分是服务。在Android应用中,负责Activity的界面大部分时间都处于相对静态的状态,直到特定的触发时刻出现。这种异步工作方式可以有效的节省系统资源。但是,有些任务需要一个持续运行的程序来负责,例如:每五分钟登录邮件服务器、检查新邮件、保持联系人条目与云服务器同步以及计算量相对较大的任务,例如图像和视频编辑。无需界面交互。必要时,Android应用程序可以启动一个服务。服务在后台运行以负责上述长时间运行的工作。服务对象本身在主线程中工作。Android程序员在设计Service时,一般会针对Service中计算量较大的部分开启一个新的线程,以免影响主线程的运行。当我们刷微博时,后台Service会上网获取新的微博,并更新到微博列表页。在服务中访问互联网不会影响阅读旧的微博条目。Service虽然功能强大,但持续运行会消耗更多的计算资源。在手机这样计算资源有限的移动平台上,Service就像精锐的骑兵。BroadcastReceiver后备队,随时待命。Android应用程序除了Activity和Service之外,还有一个重要的功能单元,就是BroadcastReceiver。它的功能比较简单,就是接收到系统广播后执行一个特定的功能。BroadcastReceiver接收Intent对象,后面会详细解释。Intent使者错过了命令,军团输掉了一场战斗。上面说了Activity和Service,各个Activity和Service之间可以实现特定的功能。一个完整的应用程序需要将这些单独的功能实体粘合在一起,例如从一个Activity启动另一个Activity,并从一个Activity中启动一个Service。Android中的Intent是军团中的信使,粘合着各个功能单元。Intent对象描述下一步要做什么,例如启动Activity或Service。我们可以在旧的Activity中发起一个Intent对象来连接新旧功能单元。在Intent对象中,可以指定要激活的功能单元,比如具体的Activity。Intent还可以将数据附加到新的功能模块中。如果不指定要激活的功能单元,Intent对象只能指定要执行的动作,Android系统会自己寻找合适的下家。这样一个Intent对象被传递给Android系统。Android系统根据Intent的要求,遍历整个系统寻找合适的app进行处理。适不适合由接收方的IntentFilter决定。App的每一个功能单元在编写的时候,都会加入一个IntentFilter的描述,来指明这个功能单元愿意执行的动作。如果Intent中指定的操作与IntentFilter指定的操作相匹配,则该应用程序是候选者。如果有多个合适的人选,Android手机会弹出菜单供用户选择。总结下面是Android开发中的一些最基本的概念。一般来说,一个Android应用程序总是由几个功能单元组成,这些功能单元通过Intent连接起来。我将在以后的文章中进行更详细的介绍。功能单元:Activity、Service、BroadcastReceiver