Android的基本架构

来源:转载

Android的基本架构:

第一层:Linux内核:核心服务(包括硬件驱动程序、进程和内存管理、安全、网络和电源管理)都是由一个Linux2.6内核处理。内核还在硬件和软件栈的其他部分之间提供一层抽象。

第二层:库和Android运行时

库:运行在内核上,C/C++编写的各种核心库

Android运行时:包括java核心库和Dalvik虚拟机。

  • Dalvik虚拟机:Android使用特定的虚拟机来保证多个实例可以高效的运行在一个设备上,Dalvik虚拟机使用设备底层的 Linux内核来处理基本的功能,包括安全、多线程以及进程和存储管理。所有的Android硬件和系统服务访问都是使用作为中间层的Dalvik来进行管理的。

第三层:应用程序框架:提供了用于创建Android应用程序的类。它还对硬件访问和对用户界面以及应用程序的资源的管理提供了一般的抽象。

第四层:所有应用程序,包括本地和第三方都使用相同的库来构建与应用层之上。


Android应用程序如何实现最少特权原则( principle of least privilege):

         每个程序为一个.apk文件。一旦程序被安装在设备中,每个应用程序都有自己的一个安全沙箱。Linux是多用户系统,每个应用程序就是一个用户。系统为每个应用程序分配一个独一无二的Linux用户ID(该ID对应用程序不可见,只能被系统使用)。系统为一个应用程序的所有文件设置权限,只有用户ID与之匹配的应用程序才可以使用它们。

每一个进程都有它自己的虚拟机(VM),一个应用程序在运行时与其他应用程序完全隔离。

每个应用程序在它自己的Linux进程中运行,Android在这个程序的空间需要执行时启动该进程,当不再需要或者系统需要释放一部分内存给其他应用程序时关闭这个进程。

 

与其他应用程序共享数据以及使用系统服务的方法:

       可以为两个应用程序分配同一个Linux用户ID,这样这两个应用程序就可以相互访问对方的文件。为了节省系统资源,拥有同一ID的应用程序可以被安排在同一个Linux进程中,并共享同一个虚拟机。

       应用程序可以请求许可来使用设备数据,如用户通讯录,SMS信息,照相机,蓝牙等。应用程序的权限必须在用户被安装时获得。

 

Android应用程序的4个构件: 

   

Activities

每个Activity就是一个拥有用户接口(即与用户交互的空间,如按钮)的单独的屏幕。 每一个应用程序或许拥有多个Activity,例如一个email程序,拥有显示邮件列表的Activity,有阅读信件的Activity等。虽然这些Activity共同工作来满足用户而的体验,但是这些Activity是彼此独立的。不同的应用程序可以启动彼此的Activity(在获得允许的情况下)。

每个Activity是一个类,必须继承自Activity。

 

Services

每个Services是一个运行在后台的来执行长周期的操作或执行远程(remote)进程的工作的组件。Service没有用户界面。比如在执行一个程序的同时一个Service在后台播放音乐,或者在不启动一个Activity的情况下从网络上接收数据。别的组件,如一个Activity可以启动一个Service并让它运行,或者绑定到它上面来与之交互。

每个Service是一个Service类的子类。

 

Content providers

content provider 管理着应用程序数据的共享集合。你可以将数据存储在文件系统、SQLite数据库、网络或者任何其他你的应用程序可以使用的持久化设备。通过content provider 应用程序可以查询和修改这些数据(如果允许的话)。如Android系统提供了一种用于管理用户联系信息的content provider 。如此所有拥有权限的应用程序都可以查询部分content provider 来读取和写入一个特定人的信息。

content provider 也常用于读写应用程序私有的不想共享的数据。如Note Pad用content provider 保存笔记。

content provider 必须继承自ContentProvider,并且实现一组标准的API。

 

Broadcast receivers

这个组件除了接受和响应广播通知之外,什么都不做。很多广播由系统产生——比如屏幕关闭,电池量变低,拍摄照片都会产生广播通知。应用程序自身也可以启动一个广播——比如,让其他应用程序知道,某些数据已经完成下载,可以被这些应用程序使用了。 一个应用程序可以有任意多个broadcast receiver, 从而响应这个应用程序认为重要的任何一个广播通知。Broadcast receiver没有UI界面。但是,他们可以创建一个状态栏消息来提示用户注意广播的产生。或者一个broadcast receiver只是其他构件的一种“途径”,它只是做很少的事情。如他可能用于请求一个service来执行一些工作。

所有的receiver都继承于BroadcastReceiver这个父类。并通过Intent交付。

 


 

Android系统设计的一个独到之处在于任何一个应用程序可以启动其他应用程序的组件。比如你希望用户使用照相机来获取照片,你不需要开发一个Activity来自己活得照片也不需要链接照相机程序的代码,你只需要简单的启动一个照相机程序的Activity并获得一个照片。结束后照片会返回到你的应用程序,你就可以使用它了,看起来就像是照相机程序是你的应用程序的一部分。

         当系统启动一个组件时就会启动这个应用程序的进程,并指出组件需要的classes。举例来说,你的程序启动了一个照相机程序的Activity来获得一幅照片,这个Activity运行在照相机程序的进程上而不是你的应用程序所在的进程。因此不同于其他系统的应用程序,Android没有单独的入口点(如main())。

         因为系统在单独的进程中运行不同的应用程序,并使用权限来限制其他应用程序使用文件,所以你的应用程序不能直接从其他应用程序触发一个activity。但是Android系统可以,所以为了触发其他应用程序的activity,你必须发送一个消息给操作系统来指明你的intent(意图)是想启动某个组件,然后系统为你触发它。

 

 

Activating (活动的)Components—By Intent

四个构件中的三个----activity、service和—---是被一种称为intent的异步消息激活。intent在运行时将一个组件与其他组件绑定在一起,不论这些组件是否属于同一个应用程序。

         一个intent是一个Intent类的实例,这个对象定义了触发一个特定组件或者特定组件的type的消息。--一个intent可以是explicit(明确的) 或者 implicit(含蓄的), respectively().

         对于activity和service来说,intent定义了执行的动作(如“显示”或者”发送”什么),或者intent还指明要使用的数据的URI,比如,一个intent传达了一个activity要显示一幅图片或者打开网页的请求。在一些情况下,你会启动一个activity来获得结果,这时候,activity同样会通过一个Intent返回结果(比如,你可以发出一个intent来让用户选择一个个人的通讯录,并将它返回给你----返回的intent包含了指向选择的通讯录的URI)。

         对于brodacast receiver,intent简单的定义了被广播的通告(例如说,一个指示设备电量过低的boradcat只包含了一个字符串”battrty is low”)。

       其他的组件类型Content provider不能用intent激活。相反的,它是在来自ContentResolver的请求标定目标时激活。content resolver把持着content provider的所有直接的事务,所以一个构件在用一个provider执行事务时需要调用ContentResolver对象的方法。这样在content provider和构件的请求信息(为了安全)之间产生了一个抽象层。

 

下面是激活每种类型控件的不同的方法:

  •   你可以将一个Intent传递给startActivity()或startActivityForResult()来启动一个activity.
  •   你可以将一个Intent传递给startService()来启动一个service.或者可以把Intent传递给bindService()来邦定一个service
  •   你可以将一个Intent传递给sendBroadcast(),sendOrderedBroadcast()或sendStickyBroadcast()来发出broadcast.
  •   你可以通过请求ContentResolver的query()方法来对content provider执行查询。

 

Manifest 文件

Android系统运行应用程序构件之前,必须通过读取这个应用程序的AndroidManifest.xml 文件

( "manifest" 文件)来确定这个构件必须存在。你的应用程序必须在这个文件中声明所有构件,并将其放在应用程序的工程根目录下。

       manifest文件往往要声明如下内容:

  •  所有应用程序需要的权限,如访问web或者读取用户通讯录的权限

 <application> <activity><service> <receiver><provider>

Activities, services, and content providers在manifest文件中必须声明,否则对系统不可见,但 broadcast receivers 可以在Manifest中声明,或者在代码中动态创建(如BroadcastReceiver)并调用registerReceiver()来注册。

  •  应用程序需要的最小API Level(一个标示Android平台版本的整数)

 

  •  应用程序需要的硬件和软件特性,如照相机、蓝牙或多交点触摸屏。
  •  应用程序需要链接的外部API库(不同于Android API),如Google Maps库
  •  其他

 

Application Resources

       一个Android应用程序不只是需要代码,它还需要独立于源代码的资源,如图片,声音文件和其他与应用程序呈现有关的东西。比如你要定义动画,菜单,样式,颜色以及用XML文件组织应用程序的布局。使用资源文件可以让你在不用修改代码的情况下修改你的应用程序的各种规格参数。并且通过。

 

 

 所有的包含在你应用程序中的资源,SDK构件工具会为其定义一个唯一的ID,你可以在你的代码或XML中的其他资源中通过ID引用该资源。

       独立于代码提供资源文件的一个重要意义在于提供可变换的资源来针对不同参数(如语言和屏幕大小)的手机设备来优化你的应用程序。比如在XML中定义了一个UI字符串,你可以将字符创转换为其他语言,并将其保存在一个特定的文件中,这样通过基于语言的qualifier和用户语言的设置,系统就会将合适的字符串应用到你的UI。

       Qualifier:Android 为你的可以替换的资源提供了很多不同的qualifiers。Qualifier是一个包含了你的资源的名称的短字符串。

分享给朋友:
您可能感兴趣的文章:
随机阅读: