Android应用的基本原理

#标签:读博客

当我刚开始接触这个霸道的android系统的时候,我看过这篇文章,(我想这篇文章肯定是一个经验丰富的人或者对android已经有了一定程度认识的人写的,反正比我水平高),现在再看的时候,有些理解更深入了,有些观点也不那么认同了。

(之所以说android霸道,其实是我的感受,你去实体店看看除了苹果和android,还有别的手机么?走进实体店,几个厂家的手机定价差不多都是3K以下,要么就是千元机了,大致功能一样,外形都是一个大屏幕&触屏,以前那种翻盖啊、全键盘啊样式再也看不到了,悲哀,逐渐走向寡头垄断的审美悲哀)(开源被商业化之后隐藏的,人类的野心和欲望可见一斑)


不说了,看原文吧.

本文转载整理自:http://mobile.51cto.com/android-387715.htm



从许多方面来说,每个Android应用程序存活在它们自己的世界中

应用基础-Application Fundamentals

Android应用程序以java作为开发语言。用Android SDK 提供的工具,可以将应用程序所需要的数据和资源文件打包到一个android包文件中,这个文件用.apk作为扩展名。所有代码都在单个.apk文件中, 当成一个应用,这个文件就是通常安装在Android设备中的应用. 一旦安装到了一个设备,每个应用生存在它自己的安全沙箱中。

  • 一个Android系统是一个多用户的Linux系统,其中的每个应用都是一个不同的用户。(android手机的多用户和linux uid是一样的么?这里是说uid)
  • 默认情况下,系统给每个应用分配一个独立的Linux用户ID(这个ID只由系统使用并且对应用来说是不可知的),系统给在某个应用中的所有文件设置了权限,所以只有分配了那个用户ID的应用才能访问它们
  • 每个进程拥有它自己的虚拟机,所以一个应用代码的运行,与其他应用代码的运行是隔离的.
  • 默认情况下,每个应用程序均运行于它自己的Linux进程中。当应用程序中的任意代码开始执行时,Android启动一个进程,而当不再需要此进程而其它应用程序又需要系统资源时,则关闭这个进程。

通过这种方法,Android系统实现了最小特权原则。默认,每个应用仅仅访问需要工作的组件,并不多做其他的事。这样创建了一个非常安全的环境,应用不能访问系统没有授权的其他部分.

然而,应用可以有多种方法来与其他应用,共享数据及访问系统服务:

  • 有可能安排两个应用共用一个linux用户ID,在那种情况下,它们能互相访问相互的数据。为了节约系统资源,拥有相同用户ID的应用,可能也被安排运行在同一个Linux进程中并共享相同的VM(应用必须被签名成同样的认证)
  • 所有应用能请求允许访问硬件数据,比如像用户通信录,SMS消息及可挂载的存储设备(SD card),摄像头,蓝牙等,所有应用的权限必须在用户安装时被许可。

上述了一个应用怎样存在于一个系统中的?

相关基本概念,这个文档的其他部分将向你介绍。如下内容:

    应用组件-Application Components

    应用组件是构建Android应用程序的关键和基石。 每个组件是一个不同的入点,系统可以从这些点进入到你的应用。对于用户来说,并不是每个组件都是实际的入点,但它们之间有一些依赖.但是每一个存在的组件 都有它自己的一个入点,并扮演一个特定的角色--每一个都是独一无二的构建块,帮助你定义你的应用的整体行为.

    有四个不同类型的应用组件,每个类型服务于一个不同的目的,并有不同的生命周期,生命周期定义了如何创建和销毁它.

    下面是四种应用组件:

    Activities活动

    • 一个activity在一个屏幕,显示一个用户接口.比如,一个email应用可能有一个activity,这个activity用于显示新的 email列表.而另一个activity用于写邮件,还有一个activity用于读取邮件.虽然这些activities一起工作于email应用 中,形成一个完整的用户体验但每一个部分又是相互独立的.正因如此,不同的应用才能启动这些活动的任意一个(如个email应用允许它).比如,一个照相 的应用,能开启一个email应用中写封新邮件的活动,让用户分享一张照片.
    • 一个activity被当作Activity的子类来实现的,在Activities开发指南中,你可以学到更多关于它的使用

    Services服务

    • 一个service是长期运行在后台,执行操作的组件,甚至可以为远程进程工作.一个服务不提供用户界面.比如,当用户在其他应用中时,一个服务 可能在后台播放音乐,或者在后台获取数据,这并不影响用户跟其他的活动进行交互操作.其他的组件,比如一个activity,可以启动一个服务,并可以让 它运行或者邦定到这个activity,以便与其进行交互操作.
    • 一个服务是作为Service子类来实现的,在Services开发指南中,你能学到更多关于它的使用

    Content providers 内容提供

    • 一个content provider管理共享的应用数据集.你可以把数据存在文件系统中,一个SQLite数据库中,网上,或你应用可以访问的永久存储器中.通过内容提供者,其他的应用可以查询甚至修改数据(如果内容提供者允许的话). 比如,Android系统提供一个内容提供者管理用户通信录信息.因此,任何拥用适当权限的应用,可以查询内容提供者的部分来(比如 ContactsContract.Data)读取和写入关于某个人的信息.内容提供者对于读取和写入属于你的应用的私有的非共享数据也是非常有用的,比 如Note Pad样例应用程序,就使用内容提供者来保存笔记的.
    • 一个内容提供者被当作ContentProvider的子类实现,并且必须实现一套标准的APIs,以让其他的应用能执行交换操作。 (内容提供者提供了一套机制:你要访问我的数据,请按我给你提供的URI&入口来访问,否则就不可访问)
    • 参考Content Providers开发指南,以了解更多信息.

    Broadcast receivers广播接收者

    • 广播接收者是一个响应系统范围广播公告(通知)的组件。许多广播信息,都是来源于系统,比如,通知屏幕关闭的公告,电量低,或抓取了一张图片.应 用也能发起广播,比如,让其他的应用知道一些数据已下载到设备了,并且他们可以使用了。虽然广播接收者,不能显示用户界面,但当一个广播事件发生时,它们 可以创建一个状态通知器,去提醒用户。但更多情况下,一个广播接收者只是一个其他组件,想要做极小量事件的一个"gateway”(途径).举例,它可能发起一个服务,去执行关于某个事件的一些工作。
    • 一个广播接收者,是当作BroadcastReceiver子类被实现的.每个广播接收者都是从Intent对象衍生出来的。更多信息,请参考BroadcastReceiver类

    任何一个应用能启动另一个其他应用的组件,是Android系统设计独一无二的方面(aspect).比如,你想要用设备的照相机拍一张图片.其他的应用已经有了这个功能,并且你的应用可以使用它,而不需要你自己去开发一个拍照相的activity。你并不需要合并(包含)或者甚至是链接camera应中的代码; 而只是,简单的启动camera应用中的活动,来拍照就可以了.当拍照完成,甚至把照片返回给你的应用,所以你能使用它。对于用户来讲,camera像是你应用中一部分.当系统开启一个组件时,它会启动那个应用的进程(如果该应用没有运行),并实例化该组件所需要的类。举例,如果你的应用开启一个camera应用的activity来拍照,这个activity将运行在属于camera应用的进程中,而不是在你的应用的进程中.因此,不像大多数其他的系统的应用,Android应用,没有单个的入点(比如没有main()函数).(为啥?因为系统的所有apk的组件,不管是受保护的还是公共的都由系统统一管理,系统根据组件声明的策略来确定是否给别人调用)

    因为系统运行的每个应用,在一个带有文件权限的,独立的进程中,这样限制了对其他应用的访问,你的应用不能直接访问其他应用中的组件.但时,Android系统也能激活其他应用的组件.你必须传一个消息给系统,指定你想要启动的组件,然后系统为你激活这个组件.

    激活组件-Activating Components

    4个组件中的其中三个组件---activities,serivces,和broadcast receivers----是被叫做intent的异步消息激活的.(可见这些组件应该有统一的查询接口,或者是相同的父类或者是相同的模板---至少组件里面应该声明过<intent-filter>用于查询)在运行时,Intents把某个的组件与其他的组件互相邦定,而不管这个组件是否属于你的应用还是其他的应用(你可以把它们想像成一个消息,用于请求一个其他组件的动作).

    一个intent是一个由Intent创建的对象.该对象定义了一个激活某个特定组件或者某个组件类型的消息,一个intent可以是显示的,同样,也可以是隐式的.

    对于activities和services,一个intent(意图)定义了一个要执行的动作(比如:to”view”或"send" 些什么),并指定了要采用的URI格式的数据(其中一些,是其他组件启动所需要知道的).比如,一个intent可能传送一个请求给一个 activity,要显示一张图片或打开一个网页.在有些情况,你启动一个activity接收一个结果,这种情况下,activity将在Intent 中返回一个结果.(比如,你可以指示一个intent,让用户取一个人的联系方式,并返回给你,返回的intent中会包含一个指向选定联系方式的URI.)

    对于广播接收者,intent只是定义了一个做为广播的公告.(比如,一个广播指出,设备电池低,它只是包含了一个动作字串,表示”电池低”).(呵呵,广播发送者和广播接受者如果频率不同怎么接收?intent的action就定义了这俩货是同一个频率,一个发送,另一个才能接收)----

    其他组件,内容提供者,不会被intents所激活.进一步讲,它是内容解释者(ContentResolver)所请求的目标所激活的.内容解释者,处理所有与内容提供者的直接交换.所以组件不需要执行与提供者交换,而是调用ContentResolver对象方法.(这一句不好理解。)为了安全 起见,组件请求信息与内容提供者之间有一个抽象层.

    下面是激活各种类型组件的几个方法:

    • 你可以通过传一个(或者一些要做新的事情)Intent参数给startActivity()或startActivityForResult()(当你想要activity返回一个参数)函数(),来启动一个activity.
    • 你可以传一个Intent给startService()方法,(或给一个新的指令给正在运行的服启),或者你可以传一个Intent给bindService()方法来邦定到服务.
    • 你可以通过使用sendBroadcast(), sendOrderedBroadcast(), 或者 sendStickyBroadcast()三种方法来广播一个intent。
    • 你可以对ContentResolver调用query()方法,对内容提供者进行查询

    关于使用intents的详细信息,请看Intents and Intent Filters 文档。在后面的文档中,也有一些关于激活某个组件的信息Activities, Services, BroadcastReceiver and Content Providers.

    清单文件-The Manifest File

    在Android系统开启一个应用组件之前,系统必须通过读取AndroidManifest.xml文件来知道组件的存在.你的应用必须把它所有的组件声明在这个文件中,并且必须在应用工程的根目录下.

    这个manifest文件除了声明组件外,还处理了许多其他的事情,比如:

    • 指定应用请求的其他权限,访问网络或访问用户的通信录
    • 声明应用要求的最小API Level,应用使用的是那个API
    • 声明应用请求和使用的软硬件特征,比如照相机,蓝牙服务,或多点触模屏
    • 应用需要链接的API库,比如Google Maps library
    • 等等

    声明组件-Declaring components

    manifest文件的主要任务是告诉系统,应用的组件,比如,一个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指定应用的icon资源 在<activity> 元素中的,android:name 属性,指定Activity子类的完全类名,android:label 属性,为activity指定一个用户可以见的标签。 你必须这样声明 所有应用的组件:

    • <activity> 声明活动的元素
    • <service> 声明服务的元素
    • <receiver> 声明广播接收者元素
    • <provider> 声明内容提供者元素

    在你代码中包含的,Activites,services和内容提供者,若没有在manifest中声明,对系统来说是不可见的,即将永远不会运 行。但是,广播接收者即可以在manifest中声明,也可以在代码中动态创建(做为BroadcastReceiver对象)并且通过 registerReceiver()方法向系统注册。

    了解manifest文件的详细构建过程,请看The AndroidManifest.xml File文档

    声明组件功能-Declaring component capabilities

    就如在上面的Activating Components中所讨论的,你可以用一个Activating Components启动activities,services和broadcast 接收者.你也可以在intent中显式的指定目标组件(使用组件类名)。然而,intent真正强大的是它的intent action.(动作)。通过使用intent动作,你只须简单的描述你要执行的action类型,(并且,可选的与执行动作有关的数据),并且允许系统 在设备上找到一个组件,这样就可以执行那个动作并启动它。如果有多个组件可以执行,intent指定的action,那么用户选择执行那一个.

    通过比较设备上的其他应用的manifest文件上的intent filters与接收到的intent.系统确定那个组件可以响应一个intent. 当你在你的应用的manifest中声明一个组件时,你可以可选择包括intent filters(意图过滤器),来指定组件的功能,以让其能响应其他应用的intents.你可以加一个组件声明的元素的子元素<intent- filter>,为你组件声明一个意图过滤器。

    比如,一个email应用中,新建email的一个activity可能在它的manifest 中声明了一个意图过滤器,以便能响应”send”意图(为了发送邮件)。然后,在你的应用中的一个activity,创建了一个带有”send” ACTION_SEND的意图,.当你调用startActivity()方法,启动该意图过滤器时,系统将其匹配到email应用的“send”活动, 并运行它。

    关于创建意图过滤器的详细信息,参考Intents and Intent Filters 文档

    声明应用需求-Declaring application requirements

    有许多设备装了Android,但它们并不提供所有相同的特点和功能.为了避免你的应用,装在一个没有你应用所必特征的设备上.通过在你的 manifest文件中声明软件硬件要求,明了的指出你的应用支持的硬件类型是非常重要的大多数声明仅仅只是信息,系统并不读取他们,但像Android 市场这样的其他服务,将读取它们,以便让用户在为他们的设备寻找应用时,可以进行筛选.

    比如,如果你的应用需要有照相机,并且使用的API是2.1(API Level 7),你应在你的manifest文件中声明这些要求.这样,那些没有照相机并且Android版本低于2.1的设备,就不能从Android市场上安装你的应用.

    但,你也可以声明你的应用使用camera,但不必须要求。那种情况,你的应用必在运行时一个检查,以确定设备是否有一个照相机,如果没有照相机,并禁止与照相相关的功能。

    下面是一些重要的设备特性,你在设计和开发应用时必须要考虑的..

    • creen size and density 屏幕尺寸与解释度
    • 为了能从它们的屏幕尺寸来分类设备,Android为每个设备定义了两个特性:屏幕尺寸(屏幕的物理尺寸)和解释度(在屏上的像素的物理密度,或者dpi--每英寸的点数).为了简化屏幕配置的所有不同类型,Android系统把它们分成可选的组,以便更容易定位
    • 屏幕大小:小,正常,大和极大
    • 屏幕解释度:低解释度,中解释度,高解释度,和极高解释度
    • 默认情况下,你的应用是兼容所有屏幕尺寸和解释度的,因为Android系统对此做了适当的调整,以使得它适合你的UI布局和图像资源
    • 然而,你应为某个屏幕尺寸创建特殊的布局,并为某些解释度提供特定的图像,使用可选的资源,并在你的manifest文件中用<supports-screens> 元素声明,以明确指出你的应用支持的屏幕尺寸.
    • 更多信息,参考Supporting Multiple Screens文档
    • Input configurations 输入配置
    • 许多设备为用提供了一个不同类型输入装置,比如,硬件键盘,轨迹球,five-way导航pad.如果你的应用必须要一个特别的输入硬件, 那么你应在你的应用中使用<uses-configuration>元素声明.但时,应用必须要一个特别的输入配置的情况是极少的.
    • Device features 设备特性
    • 在一个装有Android的设备中,有许多软硬件特性,有可能有,或有可能没有。比如照相机,光敏器件,蓝牙,或某个版本的OpenGL, 或者触模屏的精度.你应该从不假设,在所有的装有Android的设备中某个特点是可用的(除了标准的Android库),所以你应该用 <uses-feature>元素声明你的应用支持的特征.
    • Platform Version 平台版本
    • 不同的Android设备,经常运行不同的Android平台版本,比如Android1.6或者2.3. 每一个成功的版本通常包括在前一个版本中不可用的API。为了指出,那些APIs集是可用的,每个平台版本指定了一个API Level(比如, Android 1.0 is API Level 1 and Android 2.3 is API Level 9).如果你使用的APIs是在1.0版之后,加入到平台的,你应该用<uses-sdk>元素,声明最小API级别,这样就指出了那些 API将被采用.

    为你的应用声明所有必要性的要求非常重要.因为,当你把你的应用发布到Android市场.市场,将用这些声明信息来过滤出,那些应用在每个设备是可用的. 同样,你的应用应该只能在满足所有你应用需求的设备上才可用.

    更多关于Android市场如何基于这些需求过滤的,请看Market Filters文档

    应用资源-Application Resources

    一个Android应用的组成不仅只是代码----它还有与代码独立的资源,比如图像,音频文件,及与应用可显图像任何其他相关的.比如,你应该定 义动画,菜单,风格,颜色,和用XML文件定义活动的布局.使用应用资源,能让你的应用在不修改任何代码的情况下容易的升级各种特性---并且通过提供一 套可选取的资源--能优化你的应用在各种配置不同的设备中的表现(比如不同的语言和屏幕尺寸).

    对于每个包含在你的Android工程中的资源,SDK将其定义成一个唯一的整型ID,这样你就可以在你的代码中或在XML文件中定义的其他资源中 引用它.如果你的应用包括一个图片名字是logo.png(保存在res/drawable/目录 ),SDK工具将生成一个资源ID命名成R.drawable.logo,你可以用它来引用图片,并插入你的用户界面中

    提供与你的代码分开的资源的一个很重要的方面是,使得你能为不同的配置的设备提供可选资源.比如,在XML中定义UI字串,你可以把字串翻译成各种 不同的语言并保存在不同的文件中.然后,以基于语言限定词,你可以追加资源目录名(比如res/values-fr/ 用语法语资源),和用户语言设置,Android系会将相应的资源应用到你的UI中.

    Android为你的可选资源,支持许多不同的qualifiers (限定词).限定词是一个包括在你的目录名中的一个简短的字串,是为了定义那些资源将用在,该配置的设备上.再如,由于设备的屏幕的方向和尺寸不同,你通 常需要为你的活动定义不同的布局.比如,若设备的屏幕是竖向(高),你可能要一个带有重直button 的布局,当屏幕是横向的(宽),按钮应是水平对齐的.要根据方向来改变布局,你要定义两个不同的布局,并在布局的目录名中使用相应的限定词 (qualifier).然后,系统将自动根据当前的设备朝向来应用相应的布局.

    要详细了解,你的应用中能包含的各种资源,及如何为各种配置的设备创建可选资源,请看Application Resources开发指南

    原文地址:http://developer.android.com/guide/topics/fundamentals.html



    的确比第一次看顺利很多,并且有很多内容也有了自己的认识和经验。

    就这样咯。

    时间: 2024-11-08 02:23:31

    Android应用的基本原理的相关文章

    GUI的基本组成----Android GWES之基本原理篇

    Android核心分析 之十-------Android GWES之基本原理篇 我这里的GWES这个术语实际上从Microsoft 的Window上移植过来的,用GWES来表示Android的窗口事件系统不是那么准确,在Android中Window是个弱化了的概念,更多的表现在View这个概念上.在很大程度上,Android的View的概念可以代替Microsoft Window这个概念,有点和Microsof暗中较劲的意味,你用过的概念我就偏不用,这个也是我以为的设计者意图. 原始GUI基本框

    【苦读官方文档】2.Android应用程序基本原理概述

    官方文档原文地址 应用程序原理 Android应用程序是通过Java编程语言来写.Android软件开发工具把你的代码和其它数据.资源文件一起编译.打包成一个APK文件,这个文档以.apk为后缀,保存了一个Android应用程序全部的内容.Android设备通过它来安装相应的应用. 一旦安装到设备上.每一个Android应用程序就执行在各自独立的安全沙盒中: Android系统是一个多用户的Linux系统.每一个应用都是一个用户. Android系统默认会给每一个应用分配一个唯一的用户ID(这个

    Android自定义控件之自定义组合控件(三)

    前言: 前两篇介绍了自定义控件的基础原理Android自定义控件之基本原理(一).自定义属性Android自定义控件之自定义属性(二).今天重点介绍一下如何通过自定义组合控件来提高布局的复用,降低开发成本,以及维护成本. 使用自定义组合控件的好处? 我们在项目开发中经常会遇见很多相似或者相同的布局,比如APP的标题栏,我们从三种方式实现标题栏来对比自定义组件带来的好处,毕竟好的东西还是以提高开发效率,降低开发成本为导向的. 1.)第一种方式:直接在每个xml布局中写相同的标题栏布局代码 <?xm

    Android开发最佳学习路线图

          为了帮助大家更好的学习Android开发的相关知识,尚观4G智能操作系统研究室(www.up4g.com)为大家制作下面学习路线图:希望能帮助到广大的android爱好者. 在開始之前我们先来对相关知识进行一个简单的了解:   行业背景: 今天,涉及通信产业链中的每一个环节,都有Android的身影,Android是第一款全然完整打通了整个通信产业链中的操作系统,手机方案商.集成商.运营商.内容提供商.用户,都在玩Android,都吃惊于Android的爆发式增长速度,Android

    Android 自定义View合集

    自定义控件学习 https://github.com/GcsSloop/AndroidNote/tree/master/CustomView 小良自定义控件合集 https://github.com/Mr-XiaoLiang 自定义控件三部曲 http://blog.csdn.net/harvic880925?viewmode=contents Android 从0开始自定义控件之View基础知识与概念 http://blog.csdn.net/airsaid/article/details/5

    Android自定义控件之自定义ViewGroup实现标签云(四)

    前言: 前面几篇讲了自定义控件绘制原理Android自定义控件之基本原理(一),自定义属性Android自定义控件之自定义属性(二),自定义组合控件Android自定义控件之自定义组合控件(三),常言道:“好记性不如烂笔头,光说不练假把式!!!”,作为一名学渣就是因为没有遵循这句名言才沦落于此,所以要谨遵教诲,注重理论与实践相结合,今天通过自定义ViewGroup来实现一下项目中用到的标签云. 需求背景: 公司需要实现一个知识点的标签显示,每个标签的长度未知,如下图所示 基本绘制流程: 绘制原理

    Android开发最佳学习路线图(转)

    Android开发总体路线图: 基础学习——JavaSE:        很多朋友一上手就开始学习Android,似乎太着急了一些. Android应用程序开发是以Java语言为基础的,所以没有扎实的Java基础知识,只是机械的照抄别人的代码,是没有任何意义的.那么Java学到 什么程度才算是过关呢?以下的JAVA的基础(JavaSE)语法知识必须全面掌握. 经典学习视频教程 Java 概述 标示符.关键字1 标示符.关键字2 运算符 流程控制1 流程控制2 字符串数组 面向对象编程特征1 面向

    Android核心分析28篇,强烈推荐android初学者,android进阶者看看这个系列教程

    Android核心分析 之一分析方法论探讨之设计意图 http://www.apkbus.com/android-24212-1-1.html Android核心分析 之二方法论探讨之概念空间篇 http://www.apkbus.com/android-24213-1-1.html Android是什么 之三手机之硬件形态 http://www.apkbus.com/android-24215-1-2.html Android核心分析之四手机的软件形态 http://www.apkbus.co

    android插件化-apkplug中OSGI服务基本原理-08

    我们提供 apkplug 下OSGI使用demo 源码托管地址为 http://git.oschina.net/plug/OSGIService 一 OSGI与android Service 异同点 OSGI服务与android Service概念差不多也是Service ,Client 关系. android Service接口  --service.AIDL OSGI接口                --java interface 所以android 进程间通信Service只能传递序列