安卓第三夜 概念漫游(上)

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢! 

 

拿起一个手机,总是满屏的应用图标。点击图标,选择应用,玩一把游戏,刷一下微博,写一篇日记。“叮咚”一声,邮件应用提醒有一封新来的邮件。在安卓里,眼花缭乱的应用承载着各种有趣的功能。欢迎来到安卓应用的世界。

每一个应用都是存储在手机中的一段小程序。编写这段小程序,是每个安卓开发者的主要工作。程序运行后成为一个进程后,在进程的内存空间中新建一个Dalvik虚拟机。程序预设的各种视觉效果和功能,都会在这一虚拟机中进行。如同一个小小的军团,安卓应用也需要不同功能的单元配合。

 

Activity

步兵是军团的基石

 

使用手机的大多数时候,你会停留在某一个“页面”,比如和恋人的对话页面、切水果页面、相机的取景页面。用安卓的术语讲,页面是一个Activity,它是一个占据整个屏幕的界面。用户和手机可以通过Activity交流。页面,也就是Activity,是手机应用中如此常见的概念,以至于用户有时会忽视它们的存在,就像那些无比普通的小步兵。

 

观察这些页面,我们会发现一些共同点。

  • Activity包含一些特别的视觉元素,比如一个竖直列表、一个彩色的背景或者一个小小的按钮。
  • Activity呈现各种信息,比如图片、文字、输入栏等等。静态信息之外,Activity也可以播放动态的动画或视频。
  • 用户可以与Activity互动,输入信息、点击按钮、上下滑动,而Activity会根据这些互动动作,触发特定的效果。

 

 

一个应用往往包含多个页面。在某些情况下,我们会从当前Activity离开,激活并前往下一个Activity。在联系人条目菜单的页面上,点击某个联系人,进入一个新的页面,这个新的页面上包含该联系人的具体信息;再点击返回键,我们退出了包含具体信息的页面,又回到联系人条目菜单的页面上。应用的进程空间中有一个栈(stack),用来记录我们依次激活的各个Activity。新激活的Activity被压入到栈的顶端。在手机屏幕上,我们只能看到栈顶的这个Activity,也只能和该Activity互动。当我们点击返回键时,当前Activity结束,从栈中弹出。上一个被激活的Activity出现在栈顶,重新占领手机屏幕。这也就是我们按返回键时,能回到历史页面(联系人条目菜单)的原理。

 

 

正如默默守卫的小步兵,Activity也总是处于一种相对静止的某个状态,比如运行、暂停、停止等。Activity的许多功能,都是在状态切换中完成的。状态转换过程中执行的命令,都是程序员预设好的,包含在特定的方法中。比如一个Activity从未激活状态到运行状态的过程中,会自动执行Activity对象的onStart()方法。安卓程序员在该方法中,设计Activity在目标状态的效果:实现特定的页面布局,为按钮注册回调函数,访问互联网获取信息等。再比如,Activity从暂停到恢复的状态,会执行onRestart()方法。安卓程序员可以在该方法中,实现诸如调整亮度和弹出提示之类的功能。这正如小兵在平时训练时,预设了切换过程中要做的事情。小兵从一个状态进入到另一个状态,比如从“警戒”到“预备射击”。在该状态过程中,士兵执行预设动作,即装填子弹,随即进入射击待命状态。

Activity的状态与转换方法

 

有趣的是,一个安卓的Activity与互联网上的一个Web页面非常相似。它们都是充斥屏幕的页面,包含视觉元素和信息。用户可以通过这样的页面实现某些功能。就连这些界面的编写方式,也有相似之处:安卓用XML设计一个页面,而Web用HTML设计一个页面。你甚至于可以把一个应用直接看做包含了多个页面的小型网站。

 

Service

应用得当,骑兵是战场上的一把利剑。

 

安卓军团的另一个重要组成部分是Service。在安卓应用中,Activity负责的界面大部分时间处于相对静止的状态,直到有特定的触发时间发生。这种异步的工作方式,能有效的节省系统资源。然而,有一些工作需要一个持续运行的程序来负责的,比如:

  • 每五分钟登录邮件服务器,检查新邮件
  • 保持联系人条目与云服务器同步
  • 相对大运算量的工作,比如图像和视频编辑 

 

这些工作并不需要界面交互。必须的时候,安卓应用可以启动一个Service。Service在背景运行,来负责上述的需要长时间运行的工作。Service对象本身在主线程内工作。在设计Service时,安卓程序员一般会为Service内大计算量的部分开启新线程,以便不影响主线程的运行。当我们刷微博时,背景Service中访问互联网,以获得新的微博,并更新到微博列表页面。Service中的互联网访问不会影响到阅读旧有的微博条目。Service尽管功能强大,但它持续运行的工作方式会比较消耗运算资源。在手机这样运算资源有限的移动平台上,Service就好像一支精贵的骑兵。

 

 

Broadcast Receiver

预备队,随时待命。

 

除了Activity和Service,安卓应用还有一种重要的功能单元,就是Broadcast Receiver。它的功能比较简单,就是在接收到系统广播后,执行特定的功能。Broadcast Receiver接收的是Intent对象,将在后面详解。

 

 

Intent

传令兵少送了一道命令,军团输了一场战争。

上面讲了Activity和Service,每个Activity和Service之间都可以实现特定的功能。一个完整的应用需要将这些单个的功能个体粘合起来,比如从一个Activity启动另一个Activity,在比如从一个Activity内部启动一个Service。安卓中的Intent就是军团中的传令兵,粘合各个功能单元。

 

Intent对象说明了下一步要做的事情,比如启动一个Activity或Service。我们可以在旧的Activity中发起一个Intent对象,从而连接新旧的功能单元。在Intent对象中,可以说明要激活的功能单元,比如具体某一个Activity。Intent还可以附加数据,交给新的功能模块。

如果不具体说明要激活的功能单元,Intent对象可以只说明想要执行的动作,而由安卓系统寻找合适的下家。这样的Intent对象会传给安卓系统。安卓系统根据Intent的要求,在整个系统范围内遍历,找到合适的app来处理。合适与否,是由接收方的Intent Filter来决定的。每一个app的功能单元在编写时,都会附加一个Intent Filter的说明,注明该功能单元愿意执行的动作。如果Intent中说明的动作与Intent Filter说明的吻合,那么该app就是一个备选对象。如果有多个合适的备选对象,安卓手机会跳出菜单,供用户选择。

Intent和Intent Filter

 

总结

这里提到了安卓开发中最基本的一些概念。大体看来,一个安卓应用总是由数个功能单元构成,这些功能单元由Intent连接。我将在后面的文章中,深入更多细节。

功能单元:Activity, Service, Broadcast Receiver

胶水:Intent

 

欢迎继续阅读“Java快速教程”系列文章

时间: 2024-09-29 08:59:56

安卓第三夜 概念漫游(上)的相关文章

安卓第四夜 概念漫游(下)

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢!   在安卓第三夜 概念漫游(上)中,我介绍了安卓最基本的功能单元和Intent的连接方式.在这个骨架之上,我们可以进一步增加一些与开发密切相关的重要概念.   Context 一个应用是由多个Activity和Service这样的功能单元组成.一个应用共享有一个Application Context对象.在功能单元内部,可以用特定的方法来调用该对象.正如名字所表示的,Contex

安卓第五夜 维纳斯的诞生

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢!   之前各讲中,分别讲解了安卓的开发环境.架构和基本概念.从这一讲开始,我将制作一个简单的应用,并通过逐步升级它的功能,连带出安卓开发的多个情境. <维纳斯的诞生>是文艺复兴早期名画.相传美神维纳斯从海的泡沫中诞生,波提切利用大胆的笔触描绘这一古典神话.画面洋溢着对人体和美的热爱.如果在中世纪或者西班牙宗教审判时期,这幅画足够波提切利上火刑架了.    任务描述 我将制作一个简

数据库设计——三范式概念+实战

      在利用三范式设计数据库的时候,以前总以为是先画完ER图,然后导出关系模式,最后用三范式去检验数据库设计的是否合理,but not!我们在一开始画ER图的时候,就应当和三范式联系起来,将错误消灭在源头.为了能最早的检验出错误,我们就要对ER图转换成关系模式的算法和三范式是如何消除冗余,避免冲突有深刻的了解,才能知道如何最早发现错误.      本文主要以机房收费系统数据库设计中的一些东西为例,结合三范式概念,简述下三范式.         一,1NF 定义: 如果关系模式R的每个关系r

10天学安卓-第三天

原文:10天学安卓-第三天 经过第二天的学习,我们正确的调用了百度天气API,将天气信息显示到了界面上,做到这一步,我们的工作就算是完成1%了,剩下99%的工作就需要不断的润色这个未成形的APP了. 最首要的就是,我们要把那么一大堆字符转换为普通用户可以轻松理解的界面,那么我们来学习一下Android里面的界面布局. 打开res/layout/activity_main.xml文件,切换到Layouts选项卡,可以看到里面有许多项目,GridLayout.LinearLayout.Relativ

短训学习录(三)——体会到上导教班的意义

今天是第三天. 先补上昨天总结后的一件事.我下楼出去锻炼,发现门厅中有几位聊得正欢.我打了个招呼准备走,西交大的程老师却叫住我,说他们正在谈我.原来,有学校针对大学生的迷茫,要开一个环节,大概是开展和大一学生集体谈心.议论是否可以将<逆袭大学>当教材.我解释当作读物就可以了.另外一名年轻老师说下学期要当班主任,我告诉他这本书中可以帮助他发现有大学生在哪些方面有困扰.我观察过.收集过问题,而具体如何帮助学生克服,还得老师根据情况想办法. 大学生的迷茫,是很多老师关注的事,没有太好的什么办法,但老

安卓中如何在桌面图标上监听事件???

问题描述 安卓中如何在桌面图标上监听事件??? 在MIUI V5中垂直滑动音乐图标可以弹出快捷窗口,这是什么监听事件?如何实现???求大神??? 解决方案 这是小米的 launcher本身的功能,你的程序肯定监听不了那个事件的. 也就是说不更改framework那一层,单纯从Application这里来讲没有办法实现这个效果......

安卓,ios图片,字段上传,服务器接收(struts2)

问题描述 安卓,ios图片,字段上传,服务器接收(struts2) 2C 在struts.xml中加入下面语句 name=""myRequestParser"" class=""util.RequestParseWrapper"" scope=""default"" optional=""true"" /> ios上传图片(List item

安卓程序在我的电脑和手机上某些功能不可用,但是在别的手机上可用

问题描述 安卓程序在我的电脑和手机上某些功能不可用,但是在别的手机上可用 别人帮我做的一个安卓程序,但是在我电脑的模拟器上面设置里面的功能不可用, 就是点击没反应.但是别人电脑或者模拟器就可用 而且他把他编译的APK给我,里面的设置功能也不能用 程序运行正常,其他功能也正常. 解决方案 给你的是不完整的apk吧

Java编码浅析(注意区分三个概念)(转)

编码: (1)外部资源的字符集-----没有读入jvm中的数据都是外部资源 (2)jvm中数据的字符集-----都是unicode (1)和(2)之间发生交互时,如果不指定编码,则使用JVM平台默认字符集     Java与Unicode:   Java的class文件采用utf8的编码方式,JVM运行时采用utf16.   Java的字符串是unicode编码的.   总之,Java采用了unicode字符集,使之易于国际化.   Java支持哪些字符集:   即Java能识别哪些字符集并对它