android os和app的关系:
最小特权原则:Android os只为app分配能够完成其功能的最小权限,只能访问必须用到的系统组件,从而保证系统安全性。
四大组件
Android app由一系列组件构成,有的组件间相互依赖,不同的组件扮演不同的角色,完成不同的功能,在Android中主要有4大组件,分别是Activities、Services、Content providers、Broadcast receivers.
Mainfest File
在系统启动应用程序之前,系统通过读取AndroidManifest.xml(即Mainfest File)文件中的数据来确定该应用程序的组件。每个app必须在该文件中生命所有用到的组件,该文件必须在app的根目录下。
Manifest文件除了声明应用程序组件外,还做了其他一系列事情,如:
声明组件
manifest文件的重要任务之一就是将app的组件通知给系统。如声明Activity组件的简单代码如下:
"1.0" encoding="utf-8"?>
... >
"@drawable/app_icon.png" ... >
"com.example.project.ExampleActivity"
android:label="@string/example_label" ... >
...
在application元素中,利用android:icon属性来定义app的icon
在activity元素中,android:name属性定义该activity的全限定名,android:label属性指定一个字符串定义为用户可见的activity标签
同样,需要利用如下方式分别定义app的所有组件
元素定义activity组件
元素定义services组件
元素定义Broadcast receivers组件
元素定义Content provider组件Activities、Services、Content providers必须在manifest文件中声明,否则,系统不可见,导致无法运行该组件,而Broadcast providers可以在manifest文件中声明,也可以在代码中动态创建,并通过调用registerReceiver()方法注册
声明组件功能
如上所述,激活组件时,你可以用一个Intent来启动Activities,Services和Broadcast receivers。你可以通过显式命名目标组件(使用组件的类名)这样做。然而,Intent的真正力量在于 implicit intents的理念。 Implicit intents只是简单地描述要执行的操作(以及在你想执行的动作需要时传递数据),并允许系统来查找设备中可以执行该操作的组件,并启动它。如果存在可以执行由意图描述的动作多个组件,交由用户选择要使用哪一个。
系统识别出可以响应Intent组件的方法是,通过比较其他应用程序的manifest文件所提供的 intent filters中的intent来确定。
当你在你的应用程序的manifest文件中声明一个Activity,你可以选择包括一个 intent filters来声明该Activity的能力,因此它可以从其他应用程序意图做出回应。您可以通过添加一个<intent-filter>
元素作为组件的声明元素的子声明。
举例来说,如果你已经建立了与撰写新邮件活动的电子邮件应用程序,你可以声明intent filters,以应对“送”的Intent(以发送新邮件)所示:
... >
...
... >
"com.example.project.ComposeEmailActivity">
"android.intent.action.SEND" />
"*/*" />
"android.intent.category.DEFAULT" />
然后,如果另一个应用程序创建的ACTION_SEND动作并把它传递给startActivity(),该系统可以开始您的活动,以便用户可以起草和发送电子邮件。
声明应用程序要求
有多种装置搭载Android os,而不是所有的设备提供相同的特性和功能。为了防止你的应用程序被安装在缺乏必要功能的设备的上,这一点很重要,你在manifest文件中清楚地声明设备和软件要求,定义为你的应用程序支持的设备类型的配置文件。大多数这些声明是仅供参考,系统不会读取它们,但外部的服务,如谷歌播放务必阅读它们,以提供过滤,为用户当他们搜索其设备的应用程序。
例如,如果你的应用程序需要一个摄像头,并使用了Android 2.1(API等级7)推出的API,你应该声明这些在你的manifest文件这样的要求:
... >
"android.hardware.camera.any"
android:required="true" />
"7" android:targetSdkVersion="19" />
...
现在,如果没有摄像头或者设备有的Android版本比2.1低则无法安装该应用程序。
但是,你也可以声明,您的应用程序使用的摄像头,但并不需要它。在这种情况下,你的应用程序必须设置必要的属性为“false”,并检查在运行时,设备是否具有摄像头,并适时的禁用所有的相机功能。
应用程序资源
一个Android应用不仅仅由代码组件-它要求独立于代码的资源,例如图像、音频文件以及任何涉及到应用程序视觉表达的东西。例如,你可以定义动画、菜单、颜色、以及activity用户接口的布局用XML文件。使用应用程序资源使得它很容易你应用程序的多变的特性而不需要修改代码并且能过提供一系统可选的资源,使得你能优化你的应用程序为一各种不同的设备配置(例如不同语言和不同屏幕大小)。
每一个引入你应用程序的资源,SDK编译工具定义一个惟一的整数ID,你可以用来引用资源从你的应用程序代码里或定义在XML中的其它资源。例如,如果你的应用程序包含一个图像文件名字为logo.png(保存在/res/drawable/directory),SDK工作生成一个资源ID名叫R.drawable.log,你可以使用来引用 图片和插入它到你的用户接口里。
最重要一个方面是提供资源给你的源代码是给你的应用程序提供为不同设备提供不同资源的能力。例如,通过定义UI字符串在XML,你可以转换这些字符串到别的语言并且保存这些字符串在单独的文件中。然后,根据语言qualifier,你添加资源到资源目录的名字(如res/values-fr/ 为法语字符串值)并且用户的语言选项,Android系统应用合适的语言选项为你的UI。
Android支持多种不同的qulifiers为你的可选资源。qualifier是一个短字符串,以资源目录作为名字,你包含为了定义设备配置哪个资源应该被使用。另一个例子,你应该经常定义不同的布局为你的activities依赖于设备屏幕的方向和大小。例如,当设备屏幕竖立的时候(高),你或许希望一个希望按钮垂直的按钮,但是当屏幕在浏览状态下(宽),按钮应该水平对齐。为了改变布局依赖于方向,你可以定义两种不同的布局就胳合适的qualifier给每个而已目录。然后,系统自定应用合适的布局依赖于当前的设备方向。