android development Fundamentals 原文及翻译Word下载.docx
《android development Fundamentals 原文及翻译Word下载.docx》由会员分享,可在线阅读,更多相关《android development Fundamentals 原文及翻译Word下载.docx(15页珍藏版)》请在冰豆网上搜索。
而是为系统依照需求实例化提供了基本的组件。
共有四种组件类型:
活动(Activities)
一个
activity
代表用户界面的一个独立屏幕。
例如,一个邮件应用程序应该有一个activity用于显示新邮件列表,另一个activity用于撰写一封邮件,还有一个activity用于读取邮件。
尽管所有activitie协同工作以构成邮件应用程序的用户体验,但彼此之间相对独立。
应次,不同的应用程序能够从任何一个activity启动(只要邮件应用程序允许)。
例如,用户需要分享一张照片,一个拍照应用程序能够启动邮件应用程序的activity。
activity是一个实现了
Activity
的子类,你可以在
Activities
开发者指导部分了解更多。
服务(Services)
service
是在后台运行,执行长时间操作或者执行远程操作。
service不提供用户界面。
例如,当用户在另一个应用程序时,一个service可在后台播放音乐,或者是从网络上获取数据,而不阻断用户与当前activity的交互。
其他组件,比如一个activity,为了与该service互动,可以启动或者绑定它。
是一个实现了
Service
Services
广播接收器(Broadcastreceivers)
广播接收器是一个专注于接收广播通知信息,并做出对应处理的组件。
很多广播是源自于系统代码的──比如,通知时区改变、电池电量低、拍摄了一张照片或者用户改变了语言选项。
应用程序也可以进行广播──比如说,通知其它应用程序一些数据下载完成并处于可用状态。
应用程序可以拥有任意数量的广播接收器以对所有它感兴趣的通知信息予以响应。
所有的接收器均继承自BroadcastReceiver基类。
广播接收器没有用户界面。
然而,它们可以启动一个activity来响应它们收到的信息,或者用NotificationManager来通知用户。
通知可以用很多种方式来吸引用户的注意力──闪动背灯、震动、播放声音等等。
一般来说是在状态栏上放一个持久的图标,用户可以打开它并获取消息。
内容提供者(Contentproviders)
●内容提供者将一些特定的应用程序数据供给其它应用程序使用。
数据可以存储于文件系统、SQLite数据库或其它方式。
内容提供者继承于ContentProvider
基类,为其它应用程序取用和存储它管理的数据实现了一套标准方法。
然而,应用程序并不直接调用这些方法,而是使用一个ContentResolver
对象,调用它的方法作为替代。
ContentResolver可以与任意内容提供者进行会话,与其合作来对所有相关交互通讯进行管理。
●参阅独立的内容提供者ContentProviders
章节获得更多关于使用内容提供者的内容。
每当出现一个需要被特定组件处理的请求时,Android会确保那个组件的应用程序进程处于运行状态,或在必要的时候启动它。
并确保那个相应组件的实例的存在,必要时会创建那个实例。
Android系统设计的一个独特方面是任何的一个程序都可以启动另一程序的组件。
比如,你想让你的程序可以使用照相机拍照,如果已经有了实现这种功能的程序并且你你的程序能使用它(有权限),那么你就没有再要再写一个新的Activity来实现这个功能。
你的程序不需要包含或者链接这个拍照程序。
相反,你只需要在你的程序中打开这个拍照程序中的实现拍照功能的Activity。
当拍完之后,拍好的照片甚至会自动返回给你的程序。
者对于用户来说,就好像是想拍照功能的程序就是你的这个程序的一部分一样。
当系统启动一个组件之后,如果这个组件所在的程序之前没有运行的话,系统会自动开始这个程序的进程,并初始化这个组件所需要的相关类。
比如,你的程序开启了一个拍照功能程序的Activity,这时系统会启动这个Activity所在的程序,所以这个Activity运行在拍照功能的程序当中,而不是在你的程序中。
所以,不像其他操作系统的中的程序一样,Android程序没有一个单独的入口点(比如没有我们常见的main()函数)。
因为系统中的程序运行在自己的独立进程中,并且程序中的文件都有自己的限制其他程序访问的权限,所以,你的程序不能直接激活其他程序中的组件。
但是Android系统就可以。
具体是这样的实现的,为了激活(activate)其他程序中的组件,你必须向系统发送一个消息来详细说明你要启动其他组件的意图,这样系统才会为你激活这个组件。
激活组件(ActivatingComponents)
四大组件中的三个组件——activities、services和broadcast
receiver——是由一种叫intent的异步消息来激活的。
这些intents在运行时(runtime)将这些属于你的程序或不同程序的单独的组件绑定在一起(bind),你可以把这些intents看作是需要其他组件的action的messengers。
一个intent就是一个Intent对象,这个intent定义了一种可以激活(activate)某个特定组件或者某种特定类型的组件,这两种情况分别对应两种intent的定义方式或者显示的或者隐式的。
对于activities和services,一个intent定义了要执行的操作(action)(比如,要“view”或者“send”什么)和要操作的数据的URI。
比如,一个intent可能会为一个activity传递一个请求来展示一张图片或者打开一个网页。
有时,你可以启动一个activity来得到返回的结果,在这个例子中这个activity的返回的结果也是一个Intent(比如,你可以发送一个intent让用户选择一个personal
contact并返回给你——这个返回的intent就包含了一个指向用户选择的联系人的URI)。
(关于activity和service的启动方式,下面将介绍。
)
对于广播接收者来说,intent只是简单的定义了要广播的内容(比如,一个用以表明电池电量很低的广播仅包含了一个表明电池电量很低的字符串)。
最后一种组件类型content
provider并不是由intent来激活的(activate)。
而是由接收到ContentResolver的请求时激活的。
它们都各自有自己的方法来激活相应的组件:
●你可以通过传递一个Intent给startActivity()或startActivityForResult()启动一个activity(或者给他一些新的要做的内容)。
使用startActivityForResult()你将得到一个返回结果。
●你可以通过传递一个Intent给startService()来start一个service(或者给一个正在运行的service一些新的指令(instructions))。
或者你可以通过把一个Intent传递给bindService()来绑定一个service。
●你可以通过传递一个Intent给诸如sendBroadcast()、sendOrderedBroadcast()或者sendStickyBroadcast()等方法来初始化一个广播。
●你可以通过调用ContentResolver的query()方法来执行一次content
provider的查询操作。
更多的关于intent的内容,可以参看文档中的Intents
and
Intent
Filters。
更多的关于激活特定组件的内容可以参看文档中的:
Activities、Services、BroadcastReceiver、Content
Providers。
关于Manifest文件
在Android系统可以启动一个应用程序组件之前,Android系统必须通过读取这个程序的AndroidManifest.xml(即manifest文件)文件来确定要启动的组件存在。
你的程序必须在这个manifest文件声明用到的所有的组件,并且这个manifest文件必须在项目的根目录下。
另外,这个manifest文件还声明一些其他的东西,比如:
●确定这个程序需要的所有权限,比如Internet访问权限或者读取用户联系人权限。
●声明这个运行这个程序所需要的最低API版本,这个可以根据开发该程序所使用的API版本。
●声明该程序所需要的硬件或软件特征(features),比如照相机、蓝牙服务或者多点触屏。
●声明该程序需要链接(link
against)的API库(不是Andorid的framework
APIs),比如Google
Maps
library。
●等等。
组件声明
Manifest文件的首要任务就是通知系统关于程序中要使用的组件。
比如,一个manifest文件可以用如下的方式来声明一个activity:
<
?
xmlversion="
1.0"
encoding="
utf-8"
>
manifest...>
<
applicationandroid:
icon="
@drawable/app_icon.png"
...>
activityandroid:
name="
com.example.project.ExampleActivity"
android:
label="
@string/example_label"
/activity>
...
/application>
/manifest>
在<
application>
元素中,android:
icon属性用于指定一个用于标示该程序的icon。
activity>
name属性用于确定这个扩展自Activity的子类的全路径名,android:
label属性用于标示这个activity的对于用户可见的label。
你必须要用以下方式来声明你的程序组件:
●activities:
标签
●services:
service>
●broadcast
receiver:
receiver>
●content
providers:
provider>
如果程序中用到activities、services和content
providers,你没有在manifest文件中声明,那么这些组件将不会被系统知道,结果就是你的程序不能运行。
然而,broadcast
receiver既可以在manifest文件中声明也可以在代码中动态创建(BroadcastReceiver),并通过调用registerReceiver()在系统中注册。
更多关于怎样为你的程序构建manifest文件,请参看文档The
AndroidManifes.xml文件。
声明组件的能力
正如在上面Activating
Components中讨论的那样,你可以使用一个Intent来启动activities、services和broadcast
receiver。
你可以通过在intent中注明目标组件的名字(使用的是组件的类名)来显示的启动组件。
然而,intents真正强大的地方在与关于intent的actions的概念。
通过intent的actions,你可以简单的描述你要执行的操作的类型(并且可以有选择的描述你要处理的数据),可以允许系统在device中找到这个组件并启动它。
如果有多个组件可以执行intent中描述的action,这时用户就可以选择一个来执行。
系统可以识别能对某intent做出反应的方式是通过将接收到的intent和设备中其他程序的manifest文件的intent
filters进行比较实现的。
当你在程序的manifest文件中声明一个组件之后,你可以有选择包含intent
filters,这些intent
filters表明了组件对接收自其他程序的intent做出反应的能力(capabilities)。
你可以通过添加一个<
intent-filter>
元素作为a
child
of
the
component'
s
declaration
element来为你的程序声明一个intent
filter。
比如,在一个邮件程序中的一个activity可以编写新的邮件,这样的话你就需要在manifest文件中来声明一个intent
filter来对“发送”intent响应(为了发送邮件)。
这样,在你的程序中,一个activity就可以创建一个发送intent(ACTION_SEND),这样当你调用startaActivity()时,系统就会匹配邮件程序中的发送activity并启动它。
更多关于创建intent
filters的内容,可以参看Intents
Filter文档。
声明运行程序所需的条件
Andorid系统可以支持很多不同的设备,并且这些设备的性能特征并不相同。
为了防止你的程序被安装在不能正常运行你的程序的较低android系统版本上,通过在manifest文件中声明你的程序支持的设备和软件,便变得尤其重要起来。
大多数的这些声明仅是一些信息,而系统并不会读取它们,但是其他的服务比如Android
Market却会阅读这些声明来帮助通过通过自己的设备搜索软件的用户过滤软件。
比如,你的程序需要照相机,并且使用的Android2.1的APIs,那么你就必须在你的manifest文件中声明这些需要。
这样的话,在Android
Market上,没有照相机或者Android系统版本低于2.1将不能安装你的程序。
然而,如果你的程序不需要照相机,你仍可以声明你需要照相机。
这种情况下,你的程序必须在运行时做一下检查,来检查这个设备是否含有照相机,如果没有照相机可用,则系统将会使使用照相机的相关程序不能用。
下面是一些你在设计和开发你的程序时,必须要考虑的关于设备的一些重要方面:
屏幕大小和分辨率:
为了根据屏幕的类型进行分类,Android定义了两个特征:
屏幕大小和分辨率。
屏幕尺寸有:
小,中,大,超大;
屏幕分辨率类型:
低分辨率,中分辨率,高分辨率,超高分辨率;
默认情况下,你的程序可以兼容所有的屏幕尺寸和分辨率,因为Android系统对你的程序的UI布局和image资源做了适当的调整。
输入方式:
很多设备有不同类型的输入方式,比如键盘、轨迹球、五位元导航。
如果你的程序需要某特定形式的输入方式,则你必须在manifes文件中使用<
uses-configuration>
标签来声明。
不过这种情况是比较少的。
设备配置:
有许多硬件或软件并不全在Android系统的设备上,比如,一个照相机、光线传感器、某个版本的OpenGL,或者屏幕的保真度(fidelity)。
你在任何条件下都不能假定Android设备具备某种特性(feature)(当然得除掉Android标准库的情况),所以如果你的程序使用了某feature,则你必须使用<
uses-feature>
不同地
Android
平台设备通常运行不同版本的Android,比如Android1.6或者Android2.3。
每个后续版本通常包含之前版本所不支持的新增API。
InordertoindicatewhichsetofAPIsareavailable,每个平台版本对应一个
APILevel
(例如,Android1.0对应于APILevel1,Android2.3对应于APILevel9)。
如果你使用任何在1.0版之后平台新增的API,你应该使用
uses-sdk>
元素声明最低
APILevel是包含这些
API的。
为你的应用程序声明所有这些要求至关重要,因为,当你在
AndroidMarket上发布你的应用程序时,Market使用这些声明来过滤该应用程序是否对于每台设备可用。
这样,你的应用程序仅对能够满足你的应用程序要求的设备可用。
应用程序资源
一个应用程序不仅仅由代码组成——它需要区别于源代码的资源,比如图片,音频文件,以及任何与应用程序视觉呈现相关联的内容。
例如,你应该使用
XML
文件定义动画,菜单,风格,颜色,以及activity用户界面的布局。
使用应用程序资源文件,可以更容易地更新你的应用程序的特性而无需修改代码,并且—通过提供多套可替换资源文件—使您能够针对各种设备配置优化你的应用程序(比如不同语言或屏幕大小)。
对于你的安卓工程里面包含的每一项资源,
SDK构建工具定义一个唯一的正整数ID标识符,你可以使用该标识符从你的应用程序代码中或者从XML文件中定义的其他资源中特指该资源。
例如,如果你的应用程序中包含一个名为
logo.png图片文件(保存在
res/drawable/
文件夹里),SDK工具会生成一个资源ID
命名为
R.drawable.logo,你可以使用该ID特指这张图片并插入你的用户界面中。
将资源提供工作同你的源代码分隔开来最重要的原因之一是能够使您为不同的设备配置提供可替换的资源文件。
例如,在XML中定义
UI字符串,你可以将这些字符串翻译成其他语言并保存在特定的文件夹中。
然后,基于语言
qualifier/修饰词
你添加资源文件夹名称(比如
res/values-fr/
对应于法语字符串)以及用户语言设置,Android系统会给你的UI提供适当的语言字符串。
对于你的可替代资源,Android支持许多不同的
qualifiers/修饰符
。
修饰符是包含在你的资源文件夹名称中的一个短字符串,以便界定哪些设备配置可使用这些资源。
另一个例子,对于不同的设备屏幕和大小,你应当为你的activities创建不同的布局。
例如,当设备屏幕是纵向的(高),你可能希望一个按钮垂直排列的布局,但当屏幕是横向的(宽),按钮应当水平排列。
为了根据方向调整布局,你可以定义两个不同的布局文件并给每个布局文件夹提供适当的修饰符。
这样,系统会根据特定的设备方向自动为其提供适当的布局。
原文:
AndroidApplicationFundamentals
AndroidapplicationsarewrittenintheJavaprogramminglanguage.TheAndroidSDKtoolscompilethecode—alongwithanydataandresourcefiles—intoan
Androidpackage,anarchivefilewithan
.apk
suffix.Allthecodeinasingle
fileisconsideredtobeoneapplicationandisthefilethatAndroid-powereddevicesusetoinstalltheapplication.
Onceinstalledonadevice,eachAndroidapplicationlivesinitsownsecuritysandbox:
∙TheAndroidoperatingsystemisamulti-userLinuxsysteminwhicheachapplicationisadifferentuser.
∙Bydefault,thesystemassignseachapplicationauniqueLinuxuserID(theIDisusedonlybythesystemandisunknowntotheapplication).ThesystemsetspermissionsforallthefilesinanapplicationsothatonlytheuserIDassignedtothatapplicationcanaccessthem.
∙Eachprocesshasitsownvirtualmachine(VM),s