商务合作:179001057@qq.com

Android中应用架构和概念解析

技术2022-05-12  0


某平台价值19860元的编程课程资料免费领取【点我领取】


     本想会在杭州完成我出社会的第一份工作,没想到找工尾期竟然变数的选择了另一家同样大型的互联网公司。现在尘埃已经落定,最后终于如愿的选择了无线终端软件开发的岗位,并于今天注册了博客账号,今后就在这儿留下我未定的技术轨迹了。

     废话不多说,进入正题,谈谈无线开发的经验。虽说有近两年的WEB开发经验,但对于手机软件开发,却是真正的从0开始,之前试玩过了Symbian,Windows CE,但都是蜻蜓点水,了解了个皮毛。

  今天想和大家分享下近期我搭建Android平台编写第一个HelloWorld程序及Android的应用架构,开发中几个核心概念的一些心得。

 1. 搭建开发平台

   这一部分网上的教程非常多,其实非常简单,需要准备四款软件或插件:JDK,Eclipse(选择手机版),ADT(插件:Android开发工具),最后就是核心的Android SDK(Android 软件开发包)。

     安装过程网上都有,这里就不赘述了。但几个疑问一直折腾我浑身不自在,如JDK和SDK有何关系,为什么会同时存在?ADT有什么用,它与SDK又有何区别,除了Eclipse平台,还有哪些IDE可作为Android的开发平台呢等等。

  下面分享下我个人的理解:

  (1)JDK和SDK在环境中起到了什么作用,两者有什么区别和联系?

     可能在刚开发时,初学者都会问一个问题,既然SDK是JDK的一个子集,那为什么两者会同时存在,用JDK是不是就可以了?另外,Eclispe中并没有设置JDK的Path,而Android是依赖于SDK的,那此时JDK是不是意味着没有起到作用了

     其实回答这个问题非常简单,关键一点就是要明白要想Eclipse正常工作,是必须安装JDK的。在XP环境中,虽然没有在IDE中设置JDK的引用路径,但Eclipse会自动会在系统变量中寻找。这下懂了,JDK的作用就是为Eclipse运行服务的。

    第二个小问题,既然SDK是JDK的子集,那为什么不直接用JDK就可以了,还要再安装Android的SDK呢

  Android 虽然使用Java语言作为开发工具,但是在实际开发中发现,还是与Java SDK有一些不同的地方。Android SDK引用了大部分的Java SDK,少数部分被Android SDK抛弃,比如说界面部分,java.awt package除了java.awt.font被引用外,其他都被抛弃,在Android平台开发中不能使用。将Java 游戏移植到Android平台的过程中,Android  SDK与Java SDK的区别是很需要注意的地方。综上,我们能够看出,两者并不是简单的包含的关系,另外,两者底层运行的虚拟机也有很大差异

  最后,SDK是在JDK1.6发布之后才发布的,因此JDK必须选择1.6以上的版本。

 (2)ADT的作用?

 首先,它是一个Eclipse插件,意思是指如果采用Eclispe作为IDE,那么就不需要安装ADT,另一方面,ADT是为Android开发提供开发工具的升级或者变更,简单理解为在Eclipse下开发工具的升级下载工具

 (3)除Eclipse还有哪些开发平台,命令方式下又是如何操作的?

    目前官网推荐的开发IDE是Eclipse,除此之外,还有Apache Ant,然后就是最近IntelliJ IDEA声称提供Android开发支持,另外还有最传统的命令方式。一般推荐Eclipse的Mobile开发版本就可以了,至于命令行方式也不是很复杂,只需要在环境变量下声明SDK变量,并将path指向其子目录tools,然后就可以用tools下的应用程序进行创建AVD,运行avd等。

   (4)AVD是什么?  

    手机开发都拿真机开发显然不够现实,因此任何手机平台都有自己的模拟器,而AVD就是Android的模拟器(全称:Android 虚拟设备)。它是一系列软硬件指标的集合,比如说采用什么样的Android版本(如2.2),分配多大的内存卡(SD Card),使用什么样的款式(或皮肤 skins),即手机型号,另外还有一些硬件指标。这些构成了一台机器的软硬件环境。

 

 2. Android应用架构

    在搭建好android开发环境后,接下来研究下其体系结构,从理论上有个大概的意识。

 

   由于新注册用户一周内没有权限上传图片,此处先空着,日后补上Android的体系结构图。

   由图可以看出,它共分4个层次:Linux内核层,Android运行环境(Android运行库(核心库+虚拟机)和程序库),应用框架层,应用层。

  2.1 linux内核

    Android 依赖Linux 内核2.6 提供核心服务,比如安全、内存管理、进程管理、网络、硬件驱动。在这里,Linux内核扮演的是硬件层和系统其它层次之间的一个抽象层的概念。这个操作系统并非类GNU/Linux 的,因为其系统库,系统初始化和编程接口都和标准的Linux 系统是有所不同的。

 

  2.2 Android运行环境

  它分为程序库和运行库两部分。

  程序库指被Android各种组件调用的丰富的c/c++类库,这部分只对应用程序框架开发者可见(即可以调用)。它包括了很多2D 和3D 图像库OpenGL ES、数据库SQLite、对象数据库db4o 类库、媒体库、基于Linux底层系统C 库等等,让应用开发更简单多样。Google 使用Apache 的Harmony 类库,Harmony 某些方面速度快于Sun 的VM。

 而Runtime 在Dalvik Java VM 上,Dalvik 采用简练、高效的byte code 格式运行,它能够在低资耗和没有应用相互干扰的情况下并行执行多个应用。

 

 2.3 应用框架

  这部分是采用Java开发,大部分软件开发者都是基于这上面的服务(API),包括联系人,电子邮件,电话,浏览器,日历,地图等应用。

 

3. HelloWorld中涌现的几个核心概念

  3.1. Activity :    活动是最基本的Android 应用程序组件,应用程序中,一个活动通常就是一个单独的屏幕。每一个活动都被实现为一个独立的类,并且从活动基类中继承而来,活动类将会显示由视图控件组成的用户接口,并对事件做出响应。大多数的应用是由多个屏幕显示组成。例如:一个文本信息的应用也许有一个显示发送消息的联系人列表屏幕,第二个屏幕用来写文本消息和选择收件人,再来一个屏幕查看消息历史或者消息设置操作等。这里每一个这样的屏幕就是一个活动,很容易实现从一个屏幕到一个新的屏幕并且完成新的活动。在某些情况下当前的屏幕也许需要向上一个屏幕活动提供返回值--比如让用户从手机中挑选一张照片返回通讯录做为电话拨入者的头像。     当一个新的屏幕打开后,前一个屏幕将会暂停,并保存在历史堆栈中。用户可以返回到历史堆栈中的前一个屏幕。当屏幕不再使用时,还可以从历史堆栈中删除。默认情况下,Android 将会保留从主屏幕到每一个应用的运行屏幕。     简单理解Activity 代表一个用户所能看到的屏幕,Activity 主要是处理一个应用的整体性工作,例如,监听系统事件(按键事件、触摸屏事件等)、为用户显示指定的View,启动其他Activity 等。所有应用的Activity都继承于android.app.Activity 类,该类是Android 提供的基层类,其他的Activity 继承该父类后,通过Override父类的方法来实现各种功能,这种设计在其他领域也较为常见。

    3.2.Intent :      调用Android 专有类Intent 进行架构屏幕之间的切换。Intent 是描述应用想要做什么。Intent 数据结构两个最重要的部分是动作和动作对应的数据。典型的动作类型有:MAIN(活动的门户)、VIEW、PICK、EDIT等。而动作对应的数据则以URI 的形式进行表示。例如:要查看某个人的联系方式,你需要创建一个动作类型为VIEW 的Intent,以及一个表示这个人的URI。     Android 使用了Intent 这个特殊类,实现在屏幕与屏幕之间移动。Intent 类用于描述一个应用将会做什么事。在Intent 的描述结构中,有两个最重要的部分:动作和动作对应的数据。典型的动作类型有:M AIN(activity的门户)、VIEW、PICK、EDIT 等。而动作对应的数据则以URI 的形式进行表示。例如:要查看一个人的联系方式,你需要创建一个动作类型为VIEW 的intent,以及一个表示这个人的URI。     与之有关系的一个类叫IntentFilter。相对于intent 是一个有效的做某事的请求,一个intentfilter 则用于描述一个activity(或者IntentReceiver)能够操作哪些intent。一个activity 如果要显示一个人的联系方式时,需要声明一个IntentFilter,这个IntentFilter 要知道怎么去处理VIEW 动作和表示一个人的URI。IntentFilter 需要在AndroidManifest.xml 中定义。     通过解析各种intent,从一个屏幕导航到另一个屏幕是很简单的。当向前导航时,activity 将会调用startActivity(IntentmyIntent)方法。然后,系统会在所有安装的应用程序中定义的IntentFilter 中查找,找到最匹配myIntent 的Intent 对应的activity。新的activity 接收到myIntent 的通知后,开始运行。当startActivity 方法被调用将触发解析myIntent 的动作,这个机制提供了两个关键好处:A、Activities 能够重复利用从其它组件中以Intent 的形式产生的一个请求;B、Activities 可以在任何时候被一个具有相同IntentFilter 的新的Activity 取代。

   3.3. IntentReceiver:     当你希望你的应用能够对一个外部的事件(如当电话呼入时,或者数据网络可用时,或者到了晚上时)做出响应,你可以使用一个IntentReceiver。虽然IntentReceiver 在感兴趣的事件发生时,会使用NotificationManager通知用户,但它并不能生成一个UI。IntentReceiver 在AndroidManifest.xml 中注册,但也可以在代码中使用Context.registerReceiver()进行注册。当一个intentreceiver 被触发时,你的应用不必对请求调用intentreceiver,系统会在需要的时候启动你的应用。各种应用还可以通过使用Context.broadcastIntent()将它们自己的intentreceiver 广播给其它应用程序。

   3.4. Service :     一个Service 是一段长生命周期的,没有用户界面的程序。比较好的一个例子就是一个正在从播放列表中播放歌曲的媒体播放器。在一个媒体播放器的应用中,应该会有多个activity,让使用者可以选择歌曲并播放歌曲。然而,音乐重放这个功能并没有对应的activity,因为使用者当然会认为在导航到其它屏幕时音乐应该还在播放的。在这个例子中,媒体播放器这个activity 会使用Context.startService()来启动一个service,从而可以在后台保持音乐的播放。同时,系统也将保持这个service 一直执行,直到这个service 运行结束。另外,我们还可以通过使用Context.bindService()方法,连接到一个service 上(如果这个service 还没有运行将启动它)。当连接到一个service 之后,我们还可以service 提供的接口与它进行通讯。拿媒体播放器这个例子来说,我们还可以进行暂停、重播等操作。

    3.5.Content Provider :     Android 应用程序能够将它们的数据保存到文件、SQLite 数据库中,甚至是任何有效的设备中。当你想将你的应用数据与其它的应用共享时,内容提供器就可以发挥作用了。因为内容提供器类实现了一组标准的方法,从而能够让其它的应用保存或读取此内容提供器处理的各种数据类型。     数据是应用的核心。在Android 中,默认使用鼎鼎大名的SQLite 作为系统DB。但是在Android 中,使用方法有点小小的不一样。在Android 中每一个应用都运行在各自的进程中,当你的应用需要访问其他应用的数据时,也就需要数据在不同的虚拟机之间传递,这样的情况操作起来可能有些困难(正常情况下,你不能读取其他的应用的db 文件),ContentProvider 正是用来解决在不同的应用包之间共享数据的工具。     所有被一个Android 应用程序创建的偏好设置,文件和数据库都是私有的。     为了和其他应用程序共享数据,应用程序不得不创建一个Content Provider要回索其他应用程序的数据,它自己的Content Provider 必须被调用     Android 本地Content Provider 包括:     (1)CallLog:地址和接收到的电话信息     (2)Contact.People.Phones:存储电话号码 

     (3)Setting.System:系统设置和偏好设置

     ........

 

 

 


最新回复(0)