misery-年少
(
文档含英文原文和中文翻译
)
中英文翻译
安卓应用开发基础
在
Java
编程语言编写的
Android
应用程序的
Android
的
SDK
工具编译
代码
以及与任何数据和到一个
Android
< br>的包
,
一个归档文件档案资源的
.apk
后缀,所
有的在一个单一的代码
.apk
文件被认为是一个应用程序,是
Android
p>
的文件,供
电设备来安装应用程序。
一旦安装在设备上,每个
Andro
id
应用程序的生命在它自己的安全沙箱:
< br>而
Android
操作系统是一个多用户
Linux
系统中,每个应用程序是一个不同
的用户。
1
<
/p>
默认情况下,每个应用程序的系统分配一个唯一的
Linux
p>
用户
ID
(该
ID
仅
用于由系统是未知的应用程序)
,<
/p>
系统设置所有的应用程序中的文件权限,
以便
只有用户
ID
分配给该应用程序可以访问它们。
每个进程都有它自己的虚拟机(
VM
),因此应用程序的代码在从其他应用
程序隔离运行。
默认情况下,每个应用程序运行在它自己的
Linux<
/p>
进程。
Android
的启动过
程时,
应用程序的任何组件需要被执行,
然后关
闭该进程时,
它不再需要或恢复
时,系统必须为其他应用程序的
内存。
这样一来,
Android
系统实现了最小特权原则
,
也就是说,每个应用程序,
默认情况下,只能访问的组件,它需要做的工作
,没有更多,这将创建一个非常
安全的环境,使应用程序无法访问的,这就是它没有给予
许可制度的部分。
但是,
有一个应用程序的方法与其他应用程序和应用程序访问系统服务的数
据:
这有可能为两个应用程序安排共享相同的
Linux
用户
ID
,在这种情况
下,
它们能够相互访问的文件。为了节约使用相同的用户
ID<
/p>
系统资源,应用程序还
可以安排运行在相同的
Linux
进程和共享同一个
VM
(应用也必须使用相同的证
书签名)。
应用程序可以请求访问权限,
如用户的联系人,
短信,
可安装存储
(
SD
卡
)
,
摄像头,蓝牙等设备的数据,所有应用程序的权限必须由用
户在安装时授予。
这涵盖了基本就如何
Android
应用程序在系统中存在这个文件的其余部分向
您介绍:
1
、框架的核心组件定义应用程序。
2
、清单文件中声明组件和应用程序所需的设备功能。
3
、资源是从应用程序代码分开,并允许您的
应用程序正常优化的设备配置
各种其行为。
应用程序组件
(Application
Components)
2
Android
p>
的核心功能之一就是一个应用程序可以使用其它应用程序的元素
(如
果那个应用程序允许的话)
。
比如说,
如果你的应用程序需要一个图片卷动列
表,
而另一个应用程序已经开发了一个合用的而又允许别人使用的话,
你可以直接调
用那个卷动列表来完成工作,而不用自己再开发一个。你的应用程
序并没有吸
纳
或链接其它应用程序的
代码,它只是在有需求的时候启动了其它应用程序的
那个功能部分。
为达到这个目的,系统必须在一个应用
程序的一部分被需要时启动这个应
用程序,并将那个部分的
Ja
va
对象实例化。与在其它系统上的应用程序不同,
Andro
id
应用程序没有为应用准备一个单独的程序入口(比如说,没有
main()
方
法),
而是为系统依照需求实例化提供了基本的组件。共有四种组件类型:
活动
(Activities)
一个
activity
代表用户界面的一个独立屏幕。例如,一个邮件应用程序应该
有一个
activity
用于显示新邮件列表,
另一个
activity
用于撰写一封邮件,
还有
一个
activity
用于读取邮件。尽管所有
activitie
协同工作以构成邮件应用程序
的用户体验,但彼此之间相对独立。应次,不同的应用程序能够从任何一个
activity
启动
(
只要邮件应用程序允许
)
。例如,用户需要分享一张照片,一个拍
照应用程序能够启动邮件应用程序的
activity
。
activity
是一个实现了
Activity
的子类,你可以在
Activities
开发者指导部分
了解更多。
服务
(Services)
service
是在后台运行,
p>
执行长时间操作或者执行远程操作。
service
不提供
用户界面。<
/p>
例如,
当用户在另一个应用程序时,
一个
service
可在后台播放音乐
,
或者是从网络上获取数据,
而不阻断用户与当前
activity
的交互。
其他组件,
比
如一个
activity
,为了与该
service
互动,可以启动或者
绑定它。
service
是一个实现了
Service
的子类,你可以在
Services
开发者指导部分了
解更多。
3
广播接收器
(Broadcast
receivers)
广播接收器是一个专注于接收广播通知
信息,
并做出对应处理的组件。
很多
广
播是源自于系统代码的
──
比如,通知时区改变、电池电量低、
拍摄了一张照
片或者用户改变了语言选项。应用程序也可以进行广播
──
比如说,通知其它应
用程序一些数据下载完成并处于可
用状态。
应用程序可以拥有任意数量的广播接收器以对所有它
感兴趣的通知信息予
以响应。所有的接收器均继承自
Broad
castReceiver
基类。
广
播接收器没有用户界面。然而,它们可以启动一个
activity
来响应它们收
到的信息,
或者用
N
otificationManager
来通知用户。
通知可以
用很多种方式来吸
引用户的注意力
──
闪动背灯、震动、播放声音等等。一般来说是在状态栏上放
一个持久的图标,用户可以打
开它并获取消息。
内容提供者
(Content
providers)
内容提供者将一些特定的应用程序数据
供给其它应用程序使用。
数据可以存
储于文件系统、
SQLite
数据库或其它方式。
内容提供者继承
于
ContentProvider
基
类,
为其它应用程序取用和存储它管理的数据实现了一套标准方法。
< br>然而,
应用
程序并不直接调用这些方法,而是使用一个<
/p>
ContentResolver
对象,调用它的方
法作为替代。
ContentResolver
可
以与任意内容提供者进行会话,
与其合作来对所
有相关交互通讯
进行管理。
参阅独立的内容提供者
Content Providers
章节获得更多关于使用内容提供
者的内容。
每当出现一个需要被特定组件处理的请求时,
Android
会确保那个组件的应
用程序进程
处于运行状态,
或在必要的时候启动它。
并确保那个相应组件的
实例
的存在,必要时会创建那个实例。
Android
系统设计的一个独特
方面是任何的一个程序都可以启动另一程序的
组件。
比如,
p>
你想让你的程序可以使用照相机拍照,
如果已经有了实现这种功能<
/p>
的程序并且你你的程序能使用它(有权限),那么你就没有再要再写一个新的
Activity
来实现这个功能。你的程序不需要包含或者链接这个拍照程
序。相反,
4
< br>你只需要在你的程序中打开这个拍照程序中的实现拍照功能的
Activity<
/p>
。当拍完
之后,
拍好的照片甚至会自动返
回给你的程序。
者对于用户来说,
就好像是想拍
照功能的程序就是你的这个程序的一部分一样。
<
/p>
当系统启动一个组件之后,如果这个组件所在的程序之前没有运行的话,系
统会自动开始这个程序的进程,
并初始化这个组件所需要的相关类。
比如,
你的
程序开启了一个拍照功能程序的
Activity
,这时系统会启动这个
Ac
tivity
所在的
程序,所以这个
A
ctivity
运行在拍照功能的程序当中,而不是在你的程序中。所
< br>以,
不像其他操作系统的中的程序一样,
Android
程序没有一个单独的入口点
(比
如没有
我们常见的
main()
函数)。
因为系统中的程序运行在自己的独立进程中,
并且程序中的文件都有自己的
限制其他程序访问的权限,
所以,
你的程序不能直接激活其他程序中的组件。
但
是
Android
系统就可以。具体是这样的实
现的,为了激活(
activate
)其他程序中
的组件,
你必须向系统发送一个消息来详细说明你要启动其他组件的意图,<
/p>
这样
系统才会为你激活这个组件。
激活组件
(Activating Components)
四大组件中的三个组件
——
activities
、
services
p>
和
broadcast receiver
——
是由
一种叫
intent
的异步消息来激活的。
这些
intents
p>
在运行时
(
runtime
)
将这些属于
你的程序或不同程序的单独的组件绑定在
一起(
bind
),你可以把这些
in
tents
看作是需要其他组件的
action
的
messengers
。
一个
intent
< br>就是一个
Intent
对象,这个
intent
定义了一种可以激活(
activate
)
某个特定组件或者某种特定类型的组件,
这
两种情况分别对应两种
intent
的定义
方式或者显示的或者隐式的。
对于
activities
和
serv
ices
,一个
intent
定义了要
执行的操作(
action
)
(
比如,
要
“view”
或者
“send”
什么
)
和要操作的数据的
URI
。比如,一个
intent
可能会为一
个
activity
传递一个请求来展示一张图片或者打开一个网页。有时,你可以启动
一个
activity
来得到返回的结
果,
在这个例子中这个
activity
的返回的结果也是一
5
个
Intent
(比如,你可以发送一个
p>
intent
让用户选择一个
person
al contact
并返回
给你
——
这个返回的
intent
就包含了一个
指向用户选择的联系人的
URI
)。(关
于
activity
和
servic
e
的启动方式,下面将介绍。)
<
/p>
对于广播接收者来说,
intent
只是
简单的定义了要广播的内容(比如,一个
用以表明电池电量很低的广播仅包含了一个表明
电池电量很低的字符串)。
最后一种组件类型
content provider
并不是由
intent
来激活的(
activate
)。而
是由接收到
ContentResolver
的请求时激活的。
它们都各自有自己的方法来激活相应的组件:
你可以通过传递一个
Intent
给
< br>startActivity()
或
startActi
vityForResult()
启动一
个
activity
(或者给他一些新的要做的内容)。使用
startActivityForResult()
你将
得到
一个返回结果。
你可以通过传递一个
Intent
给
startService()
来
start
一个
servi
ce
(或者给一个
正在运行的
serv
ice
一些新的指令
(instructions)
)。或者你可以通过把一个
Intent
传递给<
/p>
bindService()
来绑定一个
service
。
你可以通过传递一
个
Intent
给诸如
sendBro
adcast()
、
sendOrderedBroadcas
t()
或者
sendStickyBroadcast()
p>
等方法来初始化一个广播。
你可以通过调
用
ContentResolver
的
query()
方法来执行一次
content
provider
的查询操作。
更多
的关于
intent
的内容,可以参看文档中的
Intents and Intent Filters
。更多
的关于激活特定组件的内容可以参看文档中的:
Activities
、
Services
、
BroadcastReceiver
、
Content
Providers
。
关于
Manifest
文件
6
<
/p>
在
Android
系统可以启动一个应用
程序组件之前,
Android
系统必须通过读
取这个程序的
(即
manif
est
文件)
文件来确定要启动的组件
存在。你的程序必须在这个
manifest
文件声明用到的所
有的组件,并且这个
manifest
文件必须在项目的根目录
下。
另外,这个
< br>manifest
文件还声明一些其他的东西,比如:
确定这个程序需要的所有权限,比如
Internet
访问权限或者读取用户联系人
权限。
声明这个运行这个程序所需要的最低
API
版本
,这个可以根据开发该程序
所使用的
API
版本。
声明该程序所需要的硬件或软件特征(
features
),比如照相机、蓝牙服务
或者
多点触屏。
声明该程序需要链接(
link against
)的
API
库(不是
And
orid
的
framework
APIs
),比如
Google Maps
library
。
组件声明
Manifest
文件的首要任务就是通知系统关于程序中要使用的组件。比如,一
p>
个
manifest
文件可以用如下的方式
来声明一个
activity
:
[java]
view plaincopy
1.
2.
3.
4.
5.
android:label=
6.
7.
...
7
8.
9.
在
元素中,
android:icon
p>
属性用于指定一个用于标示该程序的
icon
。
在
<
activity>
元素中,
android:name
属性用于确定这个扩展自
Activity
的
子类
的全路径名,
android:label
属性用于标示这个
activity
的对于用户可见的
label
。
你必须要用以下方式来声明你的程序组件:
1
、
act
ivities
:
标签
2
、
services:
标签
< br>
3
、
broadcast receiver
:
标签
4
、
content providers
:
标签
p>
如果程序中用到
activities
、<
/p>
services
和
content p
roviders
,你没有在
manifest
文件中声明,
那么这些组件将不会被系统知道,
结果就
是你的程序不能运行。
然
而,
broa
dcast receiver
既可以在
manifest
p>
文件中声明也可以在代码中动态创建
(
Br
oadcastReceiver
),并通过调用
regist
erReceiver()
在系统中注册。
更多关于怎样为你的程序构建
man
ifest
文件,请参看文档
The
文件。
声明组件的能力
正如在上面
Activating Components
p>
中讨论的那样,你可以使用一个
Intent
来
启动
activities
、
p>
services
和
broadcast
receiver
。你可以通过在
intent
中注明目标组
件的名字(使用的是组件的类名)来显示的启动组件。然而,
p>
intents
真正强大的
地方在与关于<
/p>
intent
的
actions
的概念。
通过
intent
的
actions
,
你可以简单的
描述
你要执行的操作的类型
(并且可以有选择的描述你要处理的
数据)
,
可以允许系
8
统在
d
evice
中找到这个组件并启动它。
如果有多个组件可以执行
intent
中描述的
action<
/p>
,这时用户就可以选择一个来执行。
系统可以识别能对某
intent
做出
反应的方式是通过将接收到的
intent
和设备
中其他程序的
manifest
文件的
intent filters
进行比较实现的。
当你在程序的
manifest
p>
文件中声明一个组件之后,你可以有选择包含
intent
filters
,
这些
intent
filters
表明了组件对接收自其他程序的
intent<
/p>
做出反应的
能力(
capabiliti
es
)。你可以通过添加一个
元素作为
a child of the
component's declaration
element
来为你的程序声明一个
intent
filter
。
< br>比如,在一个邮件程序中的一个
activity
可以编
写新的邮件,这样的话你就
需要在
manifest
文件中来声明一个
intent filter
来
对
“
发送
”intent
响应(为了发送
邮件)。这样,在你的程序中,一个
activity
就可以创建一个发送
intent(ACTI
ON_SEND)
,这样当你调用
startaActivit
y()
时,系统就会匹配邮件程
序中的发送
activity
并启动它。
更多关于创建
intent
filters
的内容,可以参看
Intents and
Intent Filter
文档。
声明运行程序所需的条件
Andorid
系统可以支持很多不同的设备,
并且这些设备的性能特征并不相同。
为了防止你的程序被安装在不能正常运行你的程序的
较低
android
系统版本上,
通过
在
manifest
文件中声明你的程序支持的设备和软件,便
变得尤其重要起来。
大多数的这些声明仅是一些信息,
而系统并
不会读取它们,
但是其他的服务比如
Android Mark
et
却会阅读这些声明来帮助通过通过自己的设备搜索软件的用户过
滤软件。
比如,
你的程序需要照相机,
并且使用的
Android2
.1
的
APIs
,
那么你就必须
在你的
manifest
文件中声明这些需要。这样的话,在
Android Market
上,没有照
相机或者
Android
< br>系统版本低于
2.1
将不能安装你的程序。
9
然而,如果你的程序不需要照相机,你仍可以声明你需要照相
机。这种情况
下,
你的程序必须在运行时做一下检查,
来检查这个设备是否含有照相机,
如果
没有照相
机可用,则系统将会使使用照相机的相关程序不能用。
p>
下面是一些你在设计和开发你的程序时,
必须要考虑的关于设备的一
些重要
方面:
屏幕大小和分辨率:
为了根据屏幕的
类型进行分类,
Android
定义了两个特征:
屏幕大小和分辨率。
屏幕尺寸有:
小,中,大,超大;
屏幕分辨率类型
:低分辨率,中分辨率,高分辨率,超高分辨率;
默认情况下
,你的程序可以兼容所有的屏幕尺寸和分辨率,因为
Android
系
统对你的程序的
UI
布局和
p>
image
资源做了适当的调整。
输入方式:
很多设备有不同类型的输入方式,比如键盘、轨迹球、五位元导航。如果你
的程序需要
某特定形式的输入方式,则你必须在
manifes
文件中使用
标签来声明。不过
这种情况是比较少的。
设备配置:
有许多硬件或软件并不全在
Andr
oid
系统的设备上,比如,一个照相机、光
线传感器、某个版
本的
OpenGL
,或者屏幕的保真
度(
fidelity
)。你在任何条件
下都不能假定
Android
设备具备某种特性(
feature
)(当然得除掉
Android<
/p>
标准
库的情况),所以如果你的程序使用了某
feature
,则你必须使用
标签来声明。
10
不同地
Android
平台设备通常运行不同版本的
Android
,比如
Android 1.6
或者
Android
2.3
。每个后续版本通常包含之前版本所不支持的新增
API
。
In
order to indicate which
set of APIs are available,
每个平台版本对应一个
API
Level (
例如,
Android 1.0
对应于
API Level 1
,
Android 2.3
对应于
API Level
9)
。如果你使用任何在
1.0
版之后平台新增的
API
,你应该使用
元
素声明最低
API
Level
是包含这些
API
的。
为你的应用程序声明所有这些要求至关重要,
因为,
当你在<
/p>
Android Market
上发布你的应用程序时,
Market
使用这些声明来过滤该应用程序是否对于每台
设备可用。
<
/p>
这样,你的应用程序仅对能够满足你的应用程序要求的设备可用。
应用程序资源
一个应用程序不仅仅由代码组成
——
它需要区别于源代码的
资源,比如图
片,音频文件,以及任何与应用程序视觉呈现相关联的内容。例如,你应该
使
用
XML
文件定义动画,菜单,风格,颜色,以及
activity
用户界面的布局。
使用应用程序资源文件,可以更容易地更新你的应用程序的特性而无需修改代
码,
并且
—
通过提供多套可替换资源文件
—
使您能够针对各种设备配置优化<
/p>
你的应用程序
(
比如不同语言或屏幕大小
)
。
对于你的安卓工程里面包含的每一项资源,
SDK
构建工具定义一个唯一的
正整数
ID
标识符,
你可以使用该标识符从
你的应用程序代码中或者从
XML
文
件
中定义的其他资源中特指该资源。例如,如果你的应用程序中包含一个名
为
图片文件
(
保存在
p>
res/drawable/
文件夹里
)
,
SDK
工具会生成一个资
源
ID
命名为
,你可以使用该
ID
特指这张图片并插入你的用
户界面中。
将资源提供工作同你的源代码分隔开来最重要的原因之一是能
够使您为不
同的设备配置提供可替换的资源文件。例如,在
XML
中定义
UI
字符串,你
可以将这些字符串
翻译成其他语言并保存在特定的文件夹中。然后,基于语
言
qualifier /
修饰词
你添加资源文件夹名称
(
比如
res/values-
fr/
对应于法语字
符串
)
以及用户语言设置,
Android
系统会给你的
UI
提供适当的语言字符串。
11
对于你的可替代资源,
Android
支持许多不同的
qualifiers /
修饰符
。
修饰符
是包含在你的资源文件夹名称
中的一个短字符串,
以便界定哪些设备配置可使用
这些资源。<
/p>
另一个例子,对于不同的设备屏幕和大小,你应当为你的
activities
创建不同的布局。
例如,当设备屏幕是纵向的
(
高
)
,你可能希望一个按钮垂直
排列的布局,但当屏幕是横向的
(
宽
)
,按钮应当水平排列。为了根据方向调整布
局,
p>
你可以定义两个不同的布局文件并给每个布局文件夹提供适当的修饰符。
这
样,系统会根据特定的设备方向自动为其提供适当的布局。
12
misery-年少
misery-年少
misery-年少
misery-年少
misery-年少
misery-年少
misery-年少
misery-年少
-
上一篇:幼儿园小班英语教案《认识ABC》
下一篇:外贸开发信