初识Android

本文基本上是摘抄网上和一些电子书的资源,具体可以参考后面的资料。

Android是什么?(What is Android?)

Android是一个针对于移动设备的软件栈,它包括操作系统,中间件和关键应用程序。AndroidSDK提供了在Android平台使用Java编程语言进行开发应用程序的必要的工具和API。

 

特性(Features)

应用程序框架(Application framework)  可重用并可替换的组件

Dalvik虚拟机(Dalvik virtualmachine) 为移动设备而优化

集成浏览器(Integrated browser) 基于开源的WebKit引擎

优化的图形处理(Optimized graphics) 以定制的2D图形库和基于OpenGLES1.0规范的3D图形(可选的硬件加速)为基础

SQLite结构化数据存储

媒体支持(Media support) 通用音频、视频,还有图像格式(MPEG4, H.264, MP3, AAC, AMR, JPG, PNG, GIF)

GSM电话(GSM Telephony) (依赖硬件)

蓝牙(Bluetooth), EDGE, 3G, and WiFi (依赖硬件)

照相机,GPS,指南针,加速感应器(Camera, GPS, compass, and accelerometer) (依赖硬件)

丰富的开发环境(Rich development environment) 包括设备模拟器,调试工具,内存和性能分析工具和用于Eclipse IDE的插件

 

Android架构(Android Architecture)

         下图展示了Android操作系统的主要组件。每个组件在下面有更详细的描述。


 

应用程序(Applications)

         Android将配备一系列核心应用程序,包括电子邮件客户端,短信程序,日历,地图,浏览器,通讯录等。所有的应用程序都是使用Java编程语言。

 

应用框架(Application Framework)

         通过提供一个开放的开发平台,Android提供给开发者建立极其丰富和创新应用的能力。开发者自由地享有硬件设备的优势,访问本地信息,运行后台服务,设置警示,向状态栏添加通知等。

         开发人员可以使用和核心应用程序使用的完全相同的API框架。应用程序架构的设计的目的是为了简化组件的重用;任何应用程序都可以发布它的功能,其他的应用程序可能会利用到这些功能(需遵守框架提供的安全约束)。依靠同样的机制,组件可以被用户所取代。

         底层的所有的应用程序是一组服务和子系统,包括:

l 一组丰富并且可扩展的view,这组view可以被用来构建一个应用程序,包括列表,表格,文本框,按钮,甚至可嵌入的Web浏览器。

l 一组Content Providers,可以使应用程序访问其它应用程序的数据(比如通讯录),或者共享自己的数据。

l 一个资源管理器(Resource Manager),提供对非代码资源的访问,比如本地化的字符串,图形和布局文件。

l 一个通知管理(Notification Manager),可以使所有的应用程序在状态栏显示定制的提醒。

l 一个Activity管理(Activity Manager),它管理的应用程序的生命周期,并且提供了一个通用的后台切换栈。

如需了解一个应用程序的详细信息和具体示例,请参考Notepad代码示例(Notepad Tutorial)。

 

开发人员也可以完全访问核心应用程序所使用的API框架。该应用程序的架构设计简化了组件的重用;任何一个应用程序都可以发布它的功能块并且任何其它的应用程序都可以使用其所发布的功能块(不过得遵循框架的安全性限制)。同样,该应用程序重用机制也使用户可以方便的替换程序组件。

 

库(Libraries)

        Android包括了一套C/C++库,这套库被Android系统的各个组件使用。通过Android的应用框架,这些功能被开放给开发者。其中的一些核心库如下:

系统C库(System C library) - 一个继承自BSD的标准C系统实现(libc),被调整成面向基于linux的嵌入式设备。

媒体库(Media Libraries) - 基于PacketVideo的的OpenCore;该库支持回放和录制许多流行的音频和视频格式,以及静态图像文件,包括MPEG4,H.264,MP3,AAC,AMR,JPG和PNG格式。

Surface管理器(Surface Manager) - 管理显示子系统,并能无缝地组合多个应用的2D和3D图像层。

LibWebCore - 一个流行的Web浏览器引擎,它对Android浏览器和嵌入式Web视图具有良好的支持。

SGL - 底层的2D图形引擎。

FreeType - 位图和矢量字体渲染。

SQLite -所有的应用程序使用并且强大而轻量级的关系型数据库引擎。

 

运行时(AndroidRuntime)

        Android包括一个核心库的集合,她们提供了Java编程语言的核心库中的绝大多数功能。

        每一个Android应用都在她自己的进程中运行,该进程也属于某个Dalvik虚拟机的实例。Dalvik被设计成能让设备高效地运行多个虚拟机。 Dalvik虚拟机执行的是.dex结尾的Dalvik可执行文件格式,该格式被优化为最小内存使用。虚拟机是基于寄存器的,并且运行那些Java编程语言所编译的类,这些类被内置的dx工具转换为.dex格式。

        Dalvik虚拟机依赖Linux内核来提供底层的功能,比如线程和低级内存管理。

 

Linux内核(LinuxKernel)

        Android依赖Linux 2.6来提供核心系统服务,比如安全、存储管理、进程管理、网络栈和驱动模型。该内核同时扮演着介于硬件和软件栈的其余部分之间的一个抽象层。

 

每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例;每个 Android 应用程序都在 Dalvik VM 的一个实例中运行,这个实例驻留在一个由 Linux 内核管理的进程中。


 目前有两种编程:
              1)基于ADT的JAVA编程
              2)基于NDK的C编程

Android编程环境需要哪些?

编程环境:Ide 、Android SDK、JDK、Java
            官方推荐用JDK+ECLIPSE+ADT+ADK(WINDOWS开发环境下。

什么是APK?
  A:
APK是AndroidPackage的缩写,即Android安装包(anapk)。APK是类似Symbian Sis或Sisx的文件格式。通过将APK文件直接传到Android模拟器或Android手机中执行即可安装。
          apk文件和sis一样最终把androidsdk编译的工程打包成一个安装程序文件格式为apk。 APK文件其实是zip格式,但后缀名被修改为apk,通过UnZip解压后,可以看到Dex文件,Dex是Dalvik VM executes的全称,即Android Dalvik执行程序,并非Java ME的字节码而是Dalvik字节码。

Android Debug Bridge(adb)

adb 实用程序支持一些可选命令行参数,以提供强大的特性,例如复制文件到设备或从设备复制文件。可以使用shell 命令行参数连接到手机本身,并发送基本的shell 命令。图4 显示在通过 USB 线连接到 Windows 笔记本电脑的一个实际设备上运行的 adb shell命令。

怎么进行Android开发?

  Android支持在模拟器上运行和调试应用软件,有兴趣的朋友可以下载他的SDK(software development kit)来了解android的界面;然后应该学习android的基本框架和应用程序的构成;最后就可以试着在sdk的APIDemo的基础上开发自己的application了。

应用程序基础(ApplicationFundamentals)

Android应用程序使用Java做为开发语言。aapt工具把编译后的Java代码连同其它应用程序需要的数据和资源文件一起打包到一个Android包文件中,这个文件使用.apk做为扩展名,它是分发应用程序并安装到移动设备的媒介,用户只需下载并安装此文件到他们的设备。单一.apk文件中的所有代码被认为是一个应用程序。

从很多方面来看,每个Android应用程序都存在于它自己的世界之中:

l 默认情况下,每个应用程序均运行于它自己的Linux进程中。当应用程序中的任意代码开始执行时,Android启动一个进程,而当不再需要此进程而其它应用程序又需要系统资源时,则关闭这个进程。

l 每个进程都运行于自己的Java虚拟机(VM)中。所以应用程序代码实际上与其它应用程序的代码是隔绝的。

l 默认情况下,每个应用程序均被赋予一个唯一的Linux用户ID,并加以权限设置,使得应用程序的文件仅对这个用户、这个应用程序可见。当然,也有其它的方法使得这些文件同样能为别的应用程序所访问。

使两个应用程序共有同一个用户ID是可行的,这种情况下他们可以看到彼此的文件。从系统资源维护的角度来看,拥有同一个ID的应用程序也将在运行时使用同一个Linux进程,以及同一个虚拟机。

应用程序组件(ApplicationComponents)

      Android的核心功能之一就是一个应用程序可以使用其它应用程序的元素(如果那个应用程序允许的话)。比如说,如果你的应用程序需要一个图片卷动列表,而另一个应用程序已经开发了一个合用的而又允许别人使用的话,你可以直接调用那个卷动列表来完成工作,而不用自己再开发一个。你的应用程序并没有吸纳或链接其它应用程序的代码,它只是在有需求的时候启动了其它应用程序的那个功能部分。

         为达到这个目的,系统必须在一个应用程序的一部分被需要时启动这个应用程序,并将那个部分的Java对象实例化。与在其它系统上的应用程序不同,Android应用程序没有为应用准备一个单独的程序入口(比如说,没有main()方法),而是为系统依照需求实例化提供了基本的组件。共有四种组件类型:

         Activities

l Activity是为用户操作而展示的可视化用户界面。比如说,一个activity可以展示一个菜单项列表供用户选择,或者显示一些包含说明的照片。一个短消息应用程序可以包括一个用于显示做为发送对象的联系人的列表的activity,一个给选定的联系人写短信的activity以及翻阅以前的短信和改变设置的activity。尽管它们一起组成了一个内聚的用户界面,但其中每个activity都与其它的保持独立。每个都是以Activity类为基类的子类实现。

l 一个应用程序可以只有一个activity,或者,如刚才提到的短信应用程序那样,包含很多个。每个activity的作用,以及其数目,自然取决于应用程序及其设计。一般情况下,总有一个应用程序被标记为用户在应用程序启动的时候第一个看到的。从一个activity转向另一个的方式是靠当前的 activity启动下一个。

l 每个activity都被给予一个默认的窗口以进行绘制。一般情况下,这个窗口是满屏的,但它也可以是一个小的位于其它窗口之上的浮动窗口。一个 activity也可以使用超过一个的窗口──比如,在activity运行过程中弹出的一个供用户反应的小对话框,或是当用户选择了屏幕上特定项目后显示的必要信息。

l 窗口显示的可视内容是由一系列视图构成的,这些视图均继承自View 基类。每个视图均控制着窗口中一块特定的矩形空间。父级视图包含并组织它子视图的布局。叶节点视图(位于视图层次最底端)在它们控制的矩形中进行绘制,并对用户对其直接操作做出响应。所以,视图是 activity与用户进行交互的界面。比如说,视图可以显示一个小图片,并在用户指点它的时候产生动作。Android有很多既定的视图供用户直接使用,包括按钮、文本域、卷轴、菜单项、复选框等等。

l 视图层次是由Activity.setContentView() 方法放入activity的窗口之中的。上下文视图是位于视图层次根位置的视图对象。(参见用户界面章节获取关于视图及层次的更多信息。)

         服务(Services)

l 服务没有可视化的用户界面,而是在一段时间内在后台运行。比如说,一个服务可以在用户做其它事情的时候在后台播放背景音乐、从网络上获取一些数据或者计算一些东西并提供给需要这个运算结果的activity使用。每个服务都继承自Service基类。

l 一个媒体播放器播放播放列表中的曲目是一个不错的例子。播放器应用程序可能有一个或多个activity来给用户选择歌曲并进行播放。然而,音乐播放这个任务本身不应该为任何activity所处理,因为用户期望在他们离开播放器应用程序而开始做别的事情时,音乐仍在继续播放。为达到这个目的,媒体播放器 activity应该启用一个运行于后台的服务。而系统将在这个activity不再显示于屏幕之后,仍维持音乐播放服务的运行。

l 你可以连接至(绑定)一个正在运行的服务(如果服务没有运行,则启动之)。连接之后,你可以通过那个服务暴露出来的接口与服务进行通讯。对于音乐服务来说,这个接口可以允许用户暂停、回退、停止以及重新开始播放。

l 如同activity和其它组件一样,服务运行于应用程序进程的主线程内。所以它不会对其它组件或用户界面有任何干扰,它们一般会派生一个新线程来进行一些耗时任务(比如音乐回放)。参见下述进程和线程(Processes and Threads)

         广播接收器(Broadcastreceivers)

l 广播接收器是一个专注于接收广播通知信息,并做出对应处理的组件。很多广播是源自于系统代码的──比如,通知时区改变、电池电量低、拍摄了一张照片或者用户改变了语言选项。应用程序也可以进行广播──比如说,通知其它应用程序一些数据下载完成并处于可用状态。

l 应用程序可以拥有任意数量的广播接收器以对所有它感兴趣的通知信息予以响应。所有的接收器均继承自BroadcastReceiver基类。

l 广播接收器没有用户界面。然而,它们可以启动一个activity来响应它们收到的信息,或者用NotificationManager来通知用户。通知可以用很多种方式来吸引用户的注意力──闪动背灯、震动、播放声音等等。一般来说是在状态栏上放一个持久的图标,用户可以打开它并获取消息。

         内容提供者(Contentproviders)

l 内容提供者将一些特定的应用程序数据供给其它应用程序使用。数据可以存储于文件系统、SQLite数据库或其它方式。内容提供者继承于ContentProvider 基类,为其它应用程序取用和存储它管理的数据实现了一套标准方法。然而,应用程序并不直接调用这些方法,而是使用一个ContentResolver 对象,调用它的方法作为替代。ContentResolver可以与任意内容提供者进行会话,与其合作来对所有相关交互通讯进行管理。

l 参阅独立的内容提供者Content Providers 章节获得更多关于使用内容提供者的内容。

         每当出现一个需要被特定组件处理的请求时,Android会确保那个组件的应用程序进程处于运行状态,或在必要的时候启动它。并确保那个相应组件的实例的存在,必要时会创建那个实例。

激活组件Activatingcomponents: intents

         当接收到ContentResolver发出的请求后,内容提供者被激活。而其它三种组件──activity、服务和广播接收器被一种叫做intent的异步消息所激活。intent是一个保存着消息内容的Intent对象。对于activity和服务来说,它指明了请求的操作名称以及作为操作对象的数据的URI和其它一些信息。比如说,它可以承载对一个activity 的请求,让它为用户显示一张图片,或者让用户编辑一些文本。而对于广播接收器而言,Intent对象指明了声明的行为。比如,它可以对所有感兴趣的对象声明照相按钮被按下。

         对于每种组件来说,激活的方法是不同的:

l 通过传递一个Intent对象至Context.startActivity()Activity.startActivityForResult()以载入(或指定新工作给)一个activity。相应的activity可以通过调用getIntent() 方法来查看激活它的intent。Android通过调用activity的onNewIntent()方法来传递给它继发的intent。

一个activity经常启动了下一个。如果它期望它所启动的那个activity返回一个结果,它会以调用startActivityForResult()来取代startActivity()。比如说,如果它启动了另外一个activity以使用户挑选一张照片,它也许想知道哪张照片被选中了。结果将会被封装在一个Intent对象中,并传递给发出调用的activityonActivityResult() 方法。

l 通过传递一个Intent对象至Context.startService()将启动一个服务(或给予正在运行的服务以一个新的指令)。Android调用服务的onStart()方法并将Intent对象传递给它。

与此类似,一个Intent可以被调用组件传递给Context.bindService()以获取一个正在运行的目标服务的连接。这个服务会经由onBind() 方法的调用获取这个Intent对象(如果服务尚未启动,bindService()会先启动它)。比如说,一个activity可以连接至前述的音乐回放服务,并提供给用户一个可操作的(用户界面)以对回放进行控制。这个activity可以调用bindService() 来建立连接,然后调用服务中定义的对象来影响回放。

后面一节:远程方法调用(Remote procedure calls)将更详细的阐明如何绑定至服务。

l 应用程序可以凭借将Intent对象传递给Context.sendBroadcast()Context.sendOrderedBroadcast(), 以及Context.sendStickyBroadcast()和其它类似方法来产生一个广播。Android会调用所有对此广播有兴趣的广播接收器的onReceive()方法,将intent传递给它们。

欲了解更多intent消息的信息,请参阅独立章节Intent和Intent滤过器(Intentsand Intent Filters)

 

关闭组件(Shuttingdown components)

         内容提供者仅在响应ContentResolver提出请求的时候激活。而一个广播接收器仅在响应广播信息的时候激活。所以,没有必要去显式的关闭这些组件。

         而activity则不同,它提供了用户界面,并与用户进行会话。所以只要会话依然持续,哪怕对话过程暂时停顿,它都会一直保持激活状态。与此相似,服务也会在很长一段时间内保持运行。所以Android为关闭activity和服务提供了一系列的方法。

l 可以通过调用它的finish()方法来关闭一个activity。一个activity可以通过调用另外一个activity(它用startActivityForResult()启动的)的finishActivity()方法来关闭它。

l 服务可以通过调用它的stopSelf()方法来停止,或者调用Context.stopService()

系统也会在组件不再被使用的时候或者Android需要为活动组件声明更多内存的时候关闭它。后面的组件的生命周期一节,将对这种可能及附属情况进行更详细的讨论。

 

参考资料:

http://www.ibm.com/developerworks/cn/opensource/os-android-devel/index.html

http://www.ibm.com/developerworks/cn/opensource/theme/android/

http://www.ibm.com/developerworks/cn/opensource/tutorials/os-eclipse-androidwidget/

http://code.google.com/p/androidbmi/wiki/AndroidLogic

http://www.eoeandroid.com/portal.php

http://developer.android.com/index.html

Android开发指南中文版

Google Android开发入门与实战

Android开发总结笔记

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值