- 浏览: 43796 次
- 性别:
- 来自: 安徽
文章分类
最新评论
-
kiol:
严重同意最后一句话:一切伟大的代码,都是在发展中不断演变、不断 ...
对解耦、关注点分离的一点小看法 -
weiwei-0926:
...
第一次参加项目立项会议感受 -
Uestc_Coolsun:
好,兄弟,我挺你!
工作与薪资分析,附2012目标
声明:本文来自于:
http://www.cnblogs.com/tianjian/category/354587.html
http://www.cnblogs.com/tianjian/archive/2012/02/16/2354679.html
什么是Android?
Android是一个移动设备的软件栈,它包含操作系统,中间件和一些关键的应用。Android SDK提供工具和必要的API用来在Android平台上使用java程序语言来开始开发应用程序。
以上↑是官方的解释,但我们需要理解几个关键点。
1.什么是软件栈:首先栈在数据结构中大家应该都明白,它是先进后出(或者后进先出)的数据结构。软件栈就是一种这样的结构,但它里面装的不单单是数据那么简单。
Android软件栈它的最底层是Linux内核,然后中间是一些库文件,最上层则是应用程序框架(或者可以叫应用程序接口俗称API)。
2.java:开发android程序一般都是用java语言开发的,但某些特殊的情况可以用到C/C++,以后可能还会添加脚本语言也说不定。这里大家只需要了解就可以了,如果某人说
android只能用java开发,你可以完全否定他的说法。至少目前也有用C/C++开发底层来提高性能的
特性
- 应用框架 允许组件的重用和更新(通俗来说就是符合面向对象的原则设计)
- Dalvik虚拟机 专为移动设备最优化而设计(以后会有详细的Dalvik虚拟机原理与参数介绍)
- 浏览器 基于开源的WebKit引擎
- 图形优化 技术支持:一个自定义的2D图形库; 基于OpenGL ES 1.0规格的3D图形 (可选择的硬件加速功能,ES版本不仅仅只有1.0还有其他版本,以后会详细说明)
- SQLite 为数据存储服务的一个结构(SQL大家都知道把,大部分相似但不是完全一样)
- 多媒体支持 支持一般的音频,视频和一些图片格式(MPEG4, H.264, MP3, AAC, AMR, JPG, PNG, GIF)
- 支持GSM 以及附属的一些硬件支持(GSM这是属于移动电话的一种技术,了解下就行了)
- 蓝牙, EDGE, 3G, and WiFi 以及附属的一些硬件支持(EDGE是一种从GSM到3G的过渡技术,它主要是在GSM系统中采用了一种新的调制方法)
- 摄像机, GPS, 指南针, 加速器 以及附属的一些硬件支持
- 丰富多样化的开发环境 包含模拟器, 调试工具, 内存和性能概要, 和一个和基于Eclipse IDE的插件(ADT)
Android 架构
这就是我们上面说的软件栈的详细架构(大家可以看到底层是linux内核,中间层是库文件与运行时库文件还有虚拟机,蓝色部分我们可以看成API体系,下面讲述每个部分)
Applications
这一层包含Android一整套核心的应用,它们分别包括email客户端,短信程序,日历,地图,浏览器,联系人和其他。这里所有应用程序都是用java语言实现的。
Application Framework
Android通过提供一个开源的平台让开发者开发出极为丰富和创新功能的应用程序。我们可以自由充分的利用硬件设备,访问本地信息,执行后台服务,设置闹钟,通知状态栏
,等等。
我们 可以 和核心 应用程序(短信,日历等) 使用 同样 的 框架 API 。应用 架构 的设计 可以 简化 组件 的 重用 (面向对象又来咯); 任何 应用程序 可以 发布 其 功能 ,任何 其他 的应用程序 都 可以使用 这些 功能 (必须遵守 框架 的 安全 限制,以后会说到的权限问题 )。框架中的所有内容都会让我们很方便的替换任何组件 。
下面的一些内容是一套应用程序的服务和系统,它们可用于所有应用程序,了解一下它们,有个印象会对以后的学习很有帮助,它们包括:
- 一套丰富和可扩展的Views(请记住View这个概念,你需要显示界面就必须用到它)用来构建一个应用程序, 包含lists, grids, text boxes, buttons, 一个嵌入式的web浏览器.
- Content Providers:允许A应用从B,C,D应用中访问数据 (作为第三方中介), 或者共享自己的数据
- Resource Manager:提供非代码资源,如本地化字符串,图形,和布局文件(以后会详细描述android的资源使用与定义)
-
Notification Manager
:允许所有应用在状态栏中显示一个自定义的通知(这是一个很方便的功能) -
Activity Manager
:管理应用的生命周期并且提供一个通用的导航回退功能(Activity是一个很重要的概念,后面会详细介绍的,留个印象
)
App framework简单来说是一套比较完善的框架系统,它可以很好的为我们开发应用程序来服务,google吧它开发出来的目的就是让你方便的使用它,在第二章我们将详细学习。现在还不着急!
Libraries
Android 有一套C/C++库文件,它被各种各样的系统组件所使用, 这些库文件越过android 应用程序框架,在它的底层并暴露了一些功能给我们使用。
以下是一些核心的库文件
- System C library - 一个BSD(BSD:http://baike.baidu.com/view/209692.htm)衍生出的标准C库的实现, 使之与嵌入式基于Linux的设备相互协调
- Media Libraries - 基于视屏软件的开源内核;它支持目前主流音频,视频格式的播放,录音,以及静态图像文件 , 包括 MPEG4, H.264, MP3, AAC, AMR, JPG, PNG
- Surface Manager - 管理访问子系统的显示和多应用无缝地整合到2D,3D。
- LibWebCore - 一个现代的web浏览器引擎,支持android浏览器和一个嵌入式的webView
- SGL - 基于SDL的2D图形引擎(底层的东西 有兴趣的可以搜索下)
- 3D libraries - 基于OpenGL ES 1.0API的3D库; 这个库使用3D硬件加速(如果有的话)或者使用高度优化的3D软件光栅器
- FreeType - 位图与矢量格式渲染
- SQLite - 一个强大的轻量级关系型数据库引擎
Android Runtime
Android平台大多数核心库功能是用java语言写的。
每一个Android应用在其自己的进程中执行,并且在Dalvik虚拟机中都有一个自己的实例。一个设备能执行多个有效的虚拟机。Dalvik 虚拟机执行的是一种.dex格式的文件 。
它经过优化以让它最低限度的内存占用。虚拟机的寄存器由java语言编译器执行编译并打包到.dex格式中
Linux Kernel
Android 是以2.6版的Linux为核心的系统服务,如安全,内存管理,进程管理,网络协议栈,驱动模型 。这里的内核可以理解为一个在硬件和软件栈之间的桥梁(比较抽象的桥梁)
快速预览
- Android App由一个或者多个应用程序组件组成,它们包括 (activities, services, content providers, and broadcast receivers)
- 在一个完整的App中每一个组件都执行一个不同的功能,并且每一个都能被单独激活(甚至由其他应用程序激活)
- 在应用程序里manifest 文件必须声明所有组件,也要声明所有应用的需求,比如android可执行的最小版本或硬件配置
- 无代码的应用程序资源(images, strings, layout files等) 应包括不同的设备配置方案(例如对于不同的屏幕来说会有不同的布局,对于不同语言来说会有不同的字符串)
--------------------------------------------------------------------------------------------------------------------------------------------------------------
强调一下Android App是用java写的,是应用程序用java写而不是说底层库。Android SDK工具编译代码并把资源文件和数据打包到
Android包中。这个名字的扩展名是
.APK。要在android设备上运行应用程序,就把必须使用APK文件格式。一般来说编译器(如Eclipse)已经帮你直接打包好了。
每一个Android应用程序都有一个安全权限:
- Android 操作系统是多用户Linux系统。你可以理解为每一个应用都有一个不同的用户
- 默认的系统会分配每一个应用程序一个唯一的Linux 用户ID (这个ID是由系统使用的,应用程序不需知道。系统在一个应用中会对所有文件设置一个权限,因此仅靠用户ID分配的程序能访问它们
- 每一个进程都有一个自己的虚拟机(这个概念很重要,要记住),所以一个应用程序的代码执行会与其他应用隔离开
- 默认的, 每一个应用程序在它自己的Linux进程中执行。当任何一个应用程序的组件需要被执行时,就会开始一个进程,当长时间
不需要或者系统必须为其他应用回收内存时将会关闭这个进程
Android 系统使用最小权限原则。就是说每一个应用,默认的,每一个组件只做它力所能及的事情。这创造了一个非常安全的环境,一
个应用程序在没有获得权限的情况下无法进入
系统的一部分。然而, 有一些方法能让一个APP共享其他的APP的数据并访问系统服务:
- 系统很可能安排2个App共享同一个Linux用户ID。这种情况下,它们能彼此访问各自的文件。用来节约系统资源,在同一个
- Linux进程中App使用同 样的用户ID,能共享同一个虚拟机(前面不是说一个进程运行在一个虚拟机吗,这里是说2个APP只要
- 在一个进程中就可以共享同一个虚拟机)
- App请求权限访问设备数据比如用户通讯录,短信,SD卡,摄像头,蓝牙。所有应用权限在用户安装App时,必须用户允许了才会生效
关于怎样让一个Android App在系统中出现,以下是概述可以稍微预览下:
- 在你的App中定义核心框架组件(什么是核心组件?请看《理论-开发前准备-1.什么是android》框架图的蓝色部分 )。
- 在manifest 文件中声明你的App组件并需求设备的功能(这个以后会讲,先了解)
- 资源与App代码分开并允许你的App为各种配置优化你的功能
Application 组件
App组件是生成一个Android应用不可或缺的结构。每一个组件都是重要的,并且不是所有组件都会有一个入口点,他们彼此相互依赖,作为每一个出现
的个体都扮演一个特殊的角色,每一个组件都是独一无二的部分,它们用来帮助你的应用程序定义整体功能。
有4个不同的应用程序组件类型,每一个类型都有明确的用途和明确的生命周期用来定义怎样创建和销毁组件
它们分别是:
android SDK中有一个Activity类,你只需要继承它就行了,以后我们会详细讲述Activity
android SDK中有一个Service 类,你只需要继承它就行了,以后我们会详细讲述service
Content providers 对于读取和写入你App中私有的数据也很有用。例如,备忘录就使用了它来保存记录。
android SDK中有一个ContentProvider类,以后我们会详细讲述ContentProvider。
android SDK中有一个BroadcastReceiver
类,以后我们会详细讲述BroadcastReceiver
,这里还要了解一下Intent,广播是
通过它来传递的,以后我们会详细描述。
Android 系统设计独特的一个方面就是任何一个App能启动另一个App的组件。例如,如果你用摄像头照一张图片,有可能另一个
App也在同时使用摄像头设备。你不 用在相机类的应用加入额外代码。你可以简单的启动一个activity捕捉图片。当完成后,相机
就像是你应用里的一部分,吧照片保存到你的App中并且你 能使用这些图片
系统启动一个组件,就开始为你的App处理任务启动了一个进程(如果不是正在运行的情况)并需要实例化。例如如果你的App 启动
了一个activity,并使用了摄像机捕捉图像,这个activity 会在摄像机的进程中执行,并不是在你App的进程中执行的。因此不像
大多数应用系统,Android App没有单一的入口点。例如它没有Java中的main函数
因为系统在执行每一个应用的时候,它使用一个单独的进程和文件权限来限制你的 App访问其他应用程序。所以你的App不需要
从另一个App中直接激活一个组件。(不采用直接的方法肯定就是用间接的方法)Android系统会在另一 个App中激活,但你必
须传递一个信息到系统,你可以使用Intent传递一个特定的组件。然后系统就会为你激活该组件。
大家看了四大组件后会不会有些难理解呢,举个通俗例子把:
我们去菜市场买菜:
菜市场的各个方向的门就是一个activity它为我们提供界面并是入口(就是通往菜市场的道路不是只有一条,因为菜市场的门有很多个,但是请记住它总有一个唯一的大门(主Activity)让我们进来选择各个小门(其他activity)).
菜农就是Content providers他为我们提供菜这个数据,并存储到它的菜篮子里
services就像是水,电,土地,他一直提供服务才能让菜市场正常运转。
Broadcast receivers就如同菜市场的广播,时不时来一句今天有什么新鲜菜啦,打折的啦,谁掉了什么东西。
至于我们是谁呢?我们是"用户",我们是体验菜市场带来的功能和服务的!!!
激活组件
我 们上面说到的4大组件中,activities,services,broadcast receivers这3个是intent调用异步消息激活的。无论这些组件是
否属于你的App或者另一个App,Intents 在运行时彼此绑定单独的一个组件(Intents 就是从其他App组件请求一个动作的负责人)。
Intent可以使用Intent类创建一个对象,并定义一个消息来激活一个特定的组件或者特定的组件类型。可以显式,隐式调用。(大
家应该对Intent有个概念了,以后会详细说明)
Activity 和Service:一个intent定义一个动作来执行Activity和Service并可以指定Url数据。例如一个intent能传达一个请求用
来 为activity显示一个图片或者打开一个Web页面。某些情况下,你能启动一个activity来接收一个结果,并返回结果到intent中。
Broadcast receivers:对于广播intent只需定义一个通知(例如,一个设备电量低的广播,你只需要使用动作string-"battery is low"就OK)
Content provider:它不是由intent激活的。当收到一个ContentResolver的请求时,它被激活。 ContentResolver(Content
解析者)用content provider直接处理所有事务。(我觉得应该是个代理模式)。ContentResolver是Content provider与组件
请求信息的中介者,是一个比较抽象的概念,它的存在是基于安全的考虑。
每一个组件都有方法让其执行:
- 你可以通过一个intent中的startActivity()或者startActivityForResult()来启动一个activity
- 你启动一个服务可以通过intent中的startService()。或者你可以通过intent的bingService()绑定服务
- 你可以用过intent的sendBroadcast()或者sendOrderedBroadcast或者sendStickyBroadcast()创建一个广播
- 你可以用ContentResolver的query()执行一个对content provider的查询
更多关于intent,Activity,Services,BroadcastReceiver和Content Provider的信息,我们以后会讲
The Manifest File
在android系统启动一个app组件之前,系统必须知道组件是否存在。以后我们创建的工程中都会有个
AndroidManifest.xml文件
,它很重要。App必须在这个文件中声明它所需要的所有组件,并且这个文件
要在工程的根目录中。(一般来说用eclipse创
建的时候就自动生成了,这里只是提醒你,这个文件是在根目录而不是在工程的某个文件夹下面)
manifest 用一个数字来描述App组件:
- 确定App请求的用户权限,比如网络访问内容或者是读取通讯录
- 声明最小API等级(这个以后会说,意思就是比如你如果声明的是7,那么7以下的设备都不能装你这个应用。)
- 声明硬件软件功能,例如摄像机,蓝牙服务或者多点触摸屏。
声明组件(components)
首要的任务就是告诉系统App的组件信息。例如,一个manifest 文件能声明一个activity::
<?
xml version
=
"1.0"
encoding
=
"utf-8"
?>
<manifest
...
>
<application
android:icon
=
"@drawable/app_icon.png"
...
>
<activity
android:name
=
"com.example.project.ExampleActivity"
android:label
=
"@string/example_label"
...
>
</activity>
...
</application>
</manifest>
在application 节点中。android:icon属性是给App定义一个icon的资源。可以理解为电脑上的桌面图标。
在activity
节点中 android:name
属性声明一个全局入口点Acitivity。(相当于入口。)android:label
是App的一个标签用来描述App的名字。
你必须按照以下格式声明app组件 :
-
<activity>
用于 activities -
<service>
用于 services -
<receiver>
用于 broadcast receivers -
<provider>
用于 content providers
其实上面节点名字就知道了,还是很好理解的。Activities, services, and content providers这三者如果你不声明这些组件那系
统就不能访问。当然就不能执行了。然而broadcast receivers不仅能在manifest声明更可以用代码(使用BroadcastReceiver)动
态创建和注册,然后系统会调用 registerReceiver()方法。
更多关于manifest的结构我们以后会详细说明
声明组件功能
上面说的,我们可以用intent启动一个activity,service和broadcast receiver。(没有Content provider 哦 !!上文中说了,给各位加强点印象)
intent action这是intent的精髓。使用intent action,你可以根据你想要执行的动作来简单的描述一个动作类型就OK了,并且系统会在设备上找到这个组件并启动执
行它。如果intent执行的action同时包括了多个组件,那么我们可以选择其中的一个。
系统识别一个组件并通过比较其他App中manifest文件的intent节点里的内容,并响应一个intent
<intent-filter>
节点。(现在不会也买没关系,这里只是理论,以后会写出来让大家看的。)
例如。系统中email app使用一个activity来生成一个新的email来让你查阅。 可以在manifest 中声明一个i"send"的intent filter(为了发送邮件)。你App中的Activity能创建一个
"send"动作--“ACTION_SEND
”。系统会匹配email app中有 "send"功能的activity 然后当你调用Intent.startActivity()方法是启动email中的那个Activity。以后我们会详细讲述
Intents 和Intent Filters
声明App的需求
Android存在多种的设备他们提供不愿意的特性与功能。为了预防你的App缺少必要的功能。你的App支持的设备类型和软件环境都必须清晰地定义出来。大多数都是描述性的信息
系统不会读取他们,但做为Android Market这种的外部服务读取他们是为了给用户在设备上搜索App时提供过滤
例如,如果你的App需求一个摄像机的功能就要使用 Android2.1 (API Level7),你应该在你的manifest文件中声明它们。那么设备没有摄像机并低于2.1的版本在Android Market
上都不能被安装
以下是一些重要的设备特性:
默 认,你的App是兼容所有屏幕和密度的,因为Android系统会适当的调整你的UI布局和图片资源(系统自带的并不好,他出来的效果不是我们想要的)。 但是你应该为某一个屏幕大小创建专门的布局,并为某一密度提供专门的图片,以供布局资源选择,在你的manifest 中显式声明使用哪一个屏幕大小可以用
<supports-screens>
节点。关于屏幕大小和密度,我们以后会详细讲述,它很重要,直接体现到你App的兼容性。<uses-configuration>
节点中声明。但是这种只需求一种输入的配置情况是非常少见的<uses-feature>
节点来声明一个特性。<uses-sdk>
节点中指定<uses-sdk android:minSdkVersion="4" />。Application 资源
Android app的组成不仅仅是代码,资源也许占用的比例更多。所以我们应该更好的区别资源。放心,Android已经有一套机制,以后我们写代码的时候会详细描 述。例如动画,菜单,风格,颜色和布局文件都是使用XML文件的。这样会更容易更新你的App资源,而且不需要修改代码。为你优化多种不同的设备提供多样 化的选择(比如不同的语言和屏幕大小)
每一种资源就包含在你的工程项目中,每一个资源都会有一个唯一的int ID,你可以直接引用。一般ID 定义在XML文件中或者用代码设置一个ID。比如你的图片名字叫logo.png。那么你的资源ID为R.drawable.logo。直接引用就行了 (现在不明白的没关系,以后会讲述)
比如字符串,如果你要支持多国语言就可以分别在不同的文件夹中定义,res/values-fr/这就是法语,r
es/values-cn/国语。Android系统会根据你设备正使用的语言来自动引用文件夹
Android 支持许多不同的 后缀修饰。(上面的-fr,-cn就是后缀修饰)。修饰一般是缩写。 还有关于横竖屏的不同支持也有相应的后缀,以后我们会说的!
好了,看完这么长长的一章,在总结一下上面的内容
1.android权限
2.四大组件(activities, services, content providers, and broadcast receivers)
3.很重要的intent
4.Manifest 文件
5.设备的一些重要特性
6.android的资源是怎样使用和适配的
相关推荐
关于android学习的基础知识,也有详细代码例子来更好的了解android的学习 是"《Android应用开发揭秘》源码" , 而且其中只是将源码文件放进来,没有包含基础知识的其他任何文本内容.
Android 是一种基于 Linux 的自由及开放源代码的操作系统,主要使用于移动设备, 如智能手机和平板电脑,...为您提供 Android 的众多实战源码、学习视频与开发技巧,希望能为大家了解、应用、 实战 android 有所帮助。
这个是android基础笔记,主要记录的是安卓的基础知识,可以看一下,深入的了解.
其中的主要内容包括:通过启动程序了解Android框架的概要,移植Android以及如何开发适合各种机器的应用程序,分析Android框架所需的基础知识,JNI(Java Native Interface)与Binder基础知识,Zygote、Service Manager...
第二部分 Android基础知识 23 第3章 设计用户界面 25 3.1 数独游戏简介 25 3.2 声明性设计 26 3.3 创建启动界面 27 3.4 使用替代资源 34 3.5 实现About对话框 37 3.6 应用主题 41 3.7 添加菜单 43 3.8 添加...
其中的主要内容包括:通过启动程序了解Android框架的概要,移植Android以及如何开发适合各种机器的应用程序,分析Android框架所需的基础知识,JNI(Java Native Interface)与Binder基础知识,Zygote、Service Manager...
第二部分 Android基础知识 第3章 设计用户界面 3.1 数独游戏简介 3.2 声明性设计 3.3 创建启动界面 3.4 使用替代资源 3.5 实现About对话框 3.6 应用主题 3.7 添加菜单 3.8 添加设置 3.9 开始新游戏 3.1 调试程序 ...
其中的主要内容包括:通过启动程序了解android框架的概要,移植android以及如何开发适合各种机器的应用程序,分析android框架所需的基础知识,jni(java native interface)与binder基础知识,zygote、service manager...
其中的主要内容包括:通过启动程序了解android框架的概要,移植android以及如何开发适合各种机器的应用程序,分析android框架所需的基础知识,jni(java native interface)与binder基础知识,zygote、service manager...
其中的主要内容包括:通过启动程序了解android框架的概要,移植android以及如何开发适合各种机器的应用程序,分析android框架所需的基础知识,jni(java native interface)与binder基础知识,zygote、service manager...
适合于入门人员,如果想进一步了解这方面的知识,你们还需要自己去图书馆借书去了解的更详细些,希望对你们有帮助,
其中的主要内容包括:通过启动程序了解android框架的概要,移植android以及如何开发适合各种机器的应用程序,分析android框架所需的基础知识,jni(java native interface)与binder基础知识,zygote、service manager...
本书共分两篇,第一篇介绍了Android 3D游戏... 有一定Android基础的读者通过阅读本书的前半部分便可快速掌握OpenGL ES的基础知识,然后通过7个真实案例的学习迅速掌握Android平台下应用程序的开发。 在职的开发人员
其中的主要内容包括:通过启动程序了解Android框架的概要,移植Android以及如何开发适合各种机器的应用程序,分析Android框架所需的基础知识,JNI(Java Native Interface)与Binder基础知识,Zygote、Service Manager...
Android开发问题集锦 情人节特刊 android基础知识解答,有助于面试笔试,以及对android有个宏观上的了解
Android UI 基础 了解 Android UI 设计的基础知识。 API 13 布局 线性布局 相对布局 列表显示 网格视图 操作栏 吐司 通知 对话框