Android基础知识了解
声明:本文来自于:
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个不同的应用程序组件类型,每一个类型都有明确的用途和明确的生命周期用来定义怎样创建和销毁组件
它们分别是:
Activities一个 activity 表示一个屏幕,可以抽象的看成是用户界面。例如,一个email 应用可能有一个activity 来显示一个新邮件的链 表,另一个activity用来读取邮件。就是说1个App可能只有1个Activity或者有多个Activity。它是程序的入 口。在email App中 通过所有Activity一起合作让用户体验一个完整的功能,但它们彼此都是独立的,便于你修改与维护。并且另外一个不同的App也 能从这些 activities中的任何一个Activity开始(如果email App允许的话)。例如,摄像机 App调用了email App里的一个 Activity,为了让用户共享一个图片会调用email App中的一个activity功能来生成新的邮件android SDK中有一个Activity类,你只需要继承它就行了,以后我们会详细讲述Activity
Services在后台执行长时间操作或者执行远程调用的时候,我们就需要用到serviceis组件。service 是没有用户界面的。例如档用户在不同 的App中切换时,一个service可能在后台播放音乐 ,或者在网络中获取数据。任何一个组件,比如Activity能打开一个service并 且为了与其进行交互让它执行或者绑定到一起。android SDK中有一个Service 类,你只需要继承它就行了,以后我们会详细讲述service
Content providers这个可以理解为一个供应商,它供应的是数据,并且能管理和共享一组App的数据。你能在文件系统,SQLite 数据库,web上存 储数据,或者任何一个本地持久存储设备中通过content provider来访问这些数据 。并且content provider也能让其他的App访 问或者修改数据(如果content provider允许的话)。例如,通讯录的信息就是它来管理的。任何App只要使用适当的权限就能查 询并读取写入关于特定某人的信息 。Content providers 对于读取和写入你App中私有的数据也很有用。例如,备忘录就使用了它来保存记录。
android SDK中有一个ContentProvider类,以后我们会详细讲述ContentProvider。
Broadcast receiversbroadcast receiver这 是一个响应系统范围内广播事件的组件。大部分广播是从系统发出的。例如,屏幕翻转(横竖屏切换),电 量低通知等都是一个广播事件.。App也能发布广播 (记住了哦,广播可以由系统发也可以由App发)。例如,让其他App知道一 些数据被下载到设备中并且告知用户能使用这些数据。广播部能显示用户界面,但 可以创建一个状态栏的通知提醒用户发生了一 个广播事件。通常情况,它更像是一个网关,他的功能旨在创建短也轻松的工作。例如Service完成了工作后的 一些事件处理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
你在manifest文件中声明一个组件时,你可以在组件的功能中声明一个intent filters(过滤intent的作用),它可以从其他app中响应intent。声明一个intent filter的方法是在描述其组件的节点中添加<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
上都不能被安装
以下是一些重要的设备特性:
屏幕大小和密度为了根据设备的屏幕类型来区别设备,Android 为每一个设备定义了2种特性。屏幕大小(屏幕的物理尺寸)和屏幕密度(在屏幕上D像素的物理密度) 这里要特别给大家介绍一下屏幕密度DPI。 DPI全称dots per inch就是说每英寸有多少个点。为了简化屏幕不同类型的配置,android系统根据不同角度来给它们分类。屏幕大小(屏幕的物理尺寸):有smlaa,normal,large,extra large。屏幕密度(DPI): low density, medium density, high density, extra high density。以后工程项目会有ldpi,mdpi,hdpi三个文件夹放图片,extra high density还没用到过默认,你的App是兼容所有屏幕和密度的,因为Android系统会适当的调整你的UI布局和图片资源(系统自带的并不好,他出来的效果不是我们想要的)。但是你应该为某一个屏幕大小创建专门的布局,并为某一密度提供专门的图片,以供布局资源选择,在你的manifest 中显式声明使用哪一个屏幕大小可以用<supports-screens>
节点。关于屏幕大小和密度,我们以后会详细讲述,它很重要,直接体现到你App的兼容性。输入配置许多设备给用户提供不同的输入方法,比如键盘,轨迹球等。如果你的App需求单独的一种硬件输入支持,就需要在manifest <uses-configuration>
节点中声明。但是这种只需求一种输入的配置情况是非常少见的设备特性有许多硬件和软件特性可能存在或者不存在,比如摄像机,光学传感器,蓝牙,某一个版本的OpenGL或者触摸屏的精确度。你永远不要假定某一特性可用。你可以使用<uses-feature>
节点来声明一个特性。平台版本不同的Android设备常常在不同的Android平台版本下运行。比如1.6或者2.3这之间有很多版本。但它们的API有一些是不一样的。举个例子,如果你需要你的APP能在1.6至2.3的所有设备上运行。你可以在<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<code>es/values-cn/国语。Android系统会根据你设备正使用的语言来自动引用文件夹
Android 支持许多不同的 后缀修饰。(上面的-fr,-cn就是后缀修饰)。修饰一般是缩写。 还有关于横竖屏的不同支持也有相应的后缀,以后我们会说的!
好了,看完这么长长的一章,在总结一下上面的内容
1.android权限
2.四大组件(activities, services, content providers, and broadcast receivers)
3.很重要的intent
4.Manifest 文件
5.设备的一些重要特性
6.android的资源是怎样使用和适配的