Android官方开发指南-应用基础(Application Fundamentals)

Application Fundamentals                                                           
    Android应用程序是用Java编程语言开发的。Android SDK工具将你的代码,以及任何数据和资源文件编译到一个APK中:一个Android文件包,是一个以.apk为后缀的存档文件。一个APK文件包含了一个Android应用程序的所有内容,是Android平台的设备用于安装应用程序的文件。
    一旦安装在设备上,每个Android应用程序都会存在于自己的安全地带:
    ·Android操作系统是一个多用户的Linux系统中,每个应用程序是不同的用户。
     ·默认情况下,系统给每个应用程序的一个唯一的Linux用户ID(ID仅被系统使用并且对于应用来说是未知的)。系统设置了一个应用程序所有文件的权限,以便 只有分配到用户ID的应用程序可以访问它们。
    ·每个进程都有自己的虚拟机(VM),因此一个应用程序的代码是隔离其他应用程序运行的。
    ·默认情况下,每一个应用程序都运行在自己的Linux进程。如果应用程序的任何组件需要执行,Android就会启动该应用程序的进程,如果没有什么要执行,或者系统要为其他应用释放内存,Android就会关闭该应用程序的进程。
    通过这种方式,Android系统实现了最小特权原则。也就是说,默认情况下每一个App只访问需求工作的组件,并不多做其他多余的事情。这就创造了一个非常安全的系统环境,如此一个App就不能访问系统没有授权的其他部分。
    然而,一个App有多种方法和其他App共享数据、访问系统服务:
    ·安排两个App共享相同的Linux用户ID是可能的,在这种情况下,它们彼此之间能互相访问对方的文件。为了节省系统资源,使用相同用户ID的App也可以安排在同一个Linux进程中运行,共享相同的VM(这些App也必须使用相同的证书签名)。
    ·一个App可以请求访问设备数据的权限。比如用户的联系人、短信、可挂载的安装存储、摄像头、蓝牙等等。所有App的权限必须在用户安装App时被许可。
    这包括App是如何存在于系统中的基础知识,本文的其余部分向您介绍:
    ·核心框架组件构建你的App.
    ·为您的App在清单文件(mainfest)中声明App需要的组件和设备功能。
    ·资源是跟App代码分离的,可以让您的App优雅的优化自己的行为,适用于各种设备配置。

应用程序组件-App Components                                                    
App应用程序组件是一个Android App应用程序的重要基石,每个组件都是一个不同的切入点,通过这个切入点系统能进入到你的App应用。对于用户而言,并不是所有的组件都是实际的切入点,但它们之间互相依赖。但是每一个存在的组件作为自己的实体,并扮演一个特定的角色。每一个组件都是一个独特的组件,可以帮助定义App应用的整体行为。
有四种不同类型的组件,每种类型的组件提供不同的目的,并且有不同的生命周期,这些生命周期明确了组件是如何被创建和销毁的。
下面是四种不同类型的应用组件:
Activities(活动)
    一个activity显示一个独立的用户界面。比如,电子邮件应用程序可能有一个activity显示新的电子邮件列表,一个activity来撰写电子邮件,和另一个activity用于读取电子邮件。虽然在电子邮件应用中activities一起形成了一个完整的用户体验,但是它们每一个都是互相独立的,因此其他应用程序能启动这些activities中的任何一个(如果电子邮件应用程序允许的话)比如:一个照相机应用,能启动电子邮件应用中用于写新邮件的activity,让用户分享一张照片。
    activity是作为Activiy的一个子类来实现的,在Activities开发指南中您可以了解更多关于activity知识。

Service(服务)
    服务是一个运行在后台的组件,可以执行长时间的运行操作或者我远程进程工作。服务不提供用户界面。例如:当用户在使用其他应用程序时,服务可以后台播放音乐,或者在后台获取网络数据而不阻碍用户与activiy界面交互。另一个组件,比如activity,能启动该服务并让它运行或者和它绑定在一起,以便与它进行交互操作。
    一个服务是作为Service的子类来实现的,在Service开发指南中您了解更多关于服务的知识。
Content providers(内容提供者)
    内容提供者管理应用程序数据的共享设置。您可以将数据存储在你的应用程序可以访问的文件系统中、SQLite数据库中、网络中或者其他任何持久性存储位置。通过内容提供者,其他应用程序可以查询甚至修改这些数据(如果内容提供者允许的话)。例如:Android系统提供一个用于管理用户的联系人信息 内容提供者,因此,拥有合适权限的应用程序都可查询这个内容提供者的部分数据(如ContactsContract.Data),用来读写某个人的信息。内容提供者也可以用来读取和写入你应用程序私有的数据,而不用来共享。例如:笔记本示例应用程序用一个内容提供者去保存笔记。
    内容提供者作为ContentProvider的子类实现的,必须实现一组彼岸准的API,使其他应用程序来执行交互操作。想了解更多内容,请参阅内容提供者开发指南。

Broadcast receivers(广播接受者)
    广播接收者是一种响应系统广播通知的组件。大多数广播都是源自于系统,例如:显示屏关闭的广播,电池电量低的广播,或者图片被抓取的广播,应用程序也可以发起广播。例如,让其他应用程序知道某些数据已经下载到设备上,并且他们可以使用了。虽然广播接受者没有用户界面,但它们可以在广播事件触发时创建一个状态栏通知提醒用户。更常见的是,虽然广播接收者仅仅是一个通向其他组件的“切入口”并且意在做非常少量的工作。例如,它可能会启动一个服务来执行一些基于事件的工作。
    广播接收者是作为BroadcastReceiver的子类来实现的,每个广播作为一个Intent对象。想了解更多内容,请参阅BroadcastReceiver类。

Android系统设计的独特方面是任何应用程序都可以启动另一个应用程序的组件。例如,如果你希望用户用设备上的照相机拍一张照片,而其他应用程序已实现这个功能,那么你的应用程序也就能使用此功能,而不用你自己去开发一个activity实现拍照功能。你没必要包含或者连接到照相机应用的代码。相反,你可以简单的启动照相机应用的拍照界面来拍照,拍完照以后,照片仍属于你的应用程序,因此你可以使用它。对于用户而言,照相机好像就是你应用程序的一部分。

当系统启动一个组件时,会启动该应用的进程(如果该应用尚未运行),并且实例化这个组件所需要的类。例如:如果你的应用程序启动了照相机拍照的界面(activity),这时这个界面(activity)运行在属于照相机应用的进程中,而不是在你的应用程序的进程中。因此,Android系统跟其他大多数系统不一样,Android应用程序没有单一的切入点(例如:没有main()函数)。

因为系统运行每一个应用程序,都是在一个有文件权限的独立进程中,限制了对其他应用的访问,你的应用程序不能直接激活其他应用程序的一个组件。但是Android系统能激活另外应用程序的组件,所以,你必须发送一个消息给系统,并指定你要启动的组件,然后系统会为你激活这个组件。

Activating Components(激活组件)
四大组件中的三个组件-activities(活动)、service(服务)、BroadcastRecevicers,都被一个叫做“意图(Intent)”的异步消息激活。 在运行时,Intents把单个组件与其他的组件互相邦定,而不管这个组件是否属于你的应用还是其他应用(你可以把它们想像成一个消息,用于请求一个其他组件的动作).

一个意图(intent)作为Intent的对象被创建,它定义了一个消息,用来激活一个特定的组件或者一类特定的组件-一个Intent 可以是显示的,也可以是隐示的。

对于activitis和Service,Intent明确要执行的操作(例如:为了“显示”和“发送”一些东西),也可以指定作用于动作的URL格式的数据(在该组件被启动时可能需要知道其他事情。    )。例如:一个Intent意图可能发出一个显示图片界面的请求,或者打开一个网页的请求。在某些情况下,你可以启动一个activity来接收一个结果,这样,该activity也会在一个Intent返回这个结果(例如: 你可以发出一个Intent,让用户选取一个人的联系方式,并返回给你,返回的Intent中会包含一个指向被选定的联系方式的URI)。

对于广播接受者,Intent只是简单的定义了作为广播的通知(例如:一个表明设备电池低的广播,仅包括一个已知的动作字串,表明“电量低”)。

其他类型组件,内容提供者不能被Intent激活。相反,它是通过 来自ContentResolver的请求的目标来激活的。ContentResolver(内容解析者)处理与内容提供者所有直接的交互,使该组件不用跟内容提供者交互,而是调用ContentResolver对象中的方法。这在ContentResolver和ContentProvider之间留下了一个抽象层(为了安全)。

用来激活不同类型组件的方法是不同的:
·你可以启动一个activity(或者让他做一些新的事情。),通过传递一个Intent给startActiviy()或者startActivityForResult()。
·有可以启动一个服务(或者给一个持续的服务一个新指令),通过传递一个Intent给startService,或者传递一个Intent给bindService()绑定到这个服务上。
·你可以发起一个广播,通过传递一个Intent给一些方法,如:sendBroadcast(),sendOrderedBroadcast(),sendStickyBroadcast().
·你可以对ContentProvider执行一次查询,通过调用ContentResolver里的query()方法。

关于Intents使用更多信息,请参阅Intents and Intent Filters(意图和意图过滤器)文档。
关于激活特定组件的更多信息,请参阅一下文档:Activities,Services,BroadcastReceiver and ContentProvider。

The Manifest File(清单文件)                                               
在Android系统启动一个应用程序组件之前,系统必须 通过读取应用程序的清单文件来确定该组件存在。你的应用必须把所有组件在这个文件中声明,并且必须在应用程序的根目录下。

清单文件除了声明应用程序的组件外,还做了很多事情,比如:
·识别应用程序需要的任何用户权限,比如:访问网络或者访问用户的联系人。
·声明应用需要的最小API Level,应用使用的是那个API。
·声明应用使用的和需要的硬件和软件功能,比如:照相机、蓝牙服务、多点触摸屏。
·应用需要连接的API库(除了Android核心框架API),如谷歌地图API库。
·等等

Declaring components(声明组件)
清单文件的首要任务是告诉系统关于应用程序的组件。例如:一个清单文件可以像下面一样声明一个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属性指向用来辨别应用程序的图标的资源。
在<activity>元素中,android:name 属性指定activity子类的全名,android:label属性用一个字串为activity指定一个用户可见的标签。

你必须这样声明应用程序的所有组件:
·<activity>元素用来声明activities
·<service>元素用来声明服务
·<receiver>元素用来声明广播接收者
·<provider>元素用来声明内容提供者
Activities,services 和Content Providers被你包含在代码中但是没有在清单文件中声明,这样系统无法识别它们,也不能运行它们。然后广播接收者既可以在清单文件中声明,也可以动态的在代码中创建(作为BroadcastReceiver对象)并通过系统调用registerReceiver()方法进行注册。

关于如何构建你的应用的清单文件的更多内容,请参阅AndroidManifest.xml文件文档。

Declaring component capabilities(声明组件功能)
如上述讨论,要激活组件,你可以用一个Intent来启动activities,services和广播接收者。你
同样可以通过在Intent显示的指定目标组件来启动这些组件。但是,Intent的真正的力量在于隐
示Intent的概念。隐示Intent仅仅描述要执行的操作(以及,可选的,与想要执行的操作有关的数据),并允许系统查找可以执行的操作,从而启动设备上相关的组件。如果有多个组件符合执行Intent所描述的动作,那时,用户可以选择其中的一个组件。

系统辨别可以对意图做出响应的组件的方法是通过比较接收到设备上其他应用程序的清单文件中所提供的意图过滤器的意图。

当你在你的应用程序的manifest中声明一个activity组件时,你可以可选择包括Intent filters(意图过滤器),来声明该activity的功能,以让其能响应其他应用的intents。通过增加一个组件声明元素的元素<intent-filter>,你可以为你的组件声明一个Intent过滤器。

例如:你已经创建了一个有撰写新邮件界面的电子邮箱应用程序,你可以声明一个Intent过滤器来响应“发送”意图,像这样:
<manifest ... >
    ...
   
<application ... >
       
<activity android:name="com.example.project.ComposeEmailActivity">
           
<intent-filter>
               
<action android:name="android.intent.action.SEND" />
               
<data android:type="*/*" />
               
<category android:name="android.intent.category.DEFAULT" />
           
</intent-filter>
       
</activity>
   
</application>
</manifest>
那时,如果有其他应用程序创建了一个有ACTION_SEND动作Intent,并把Intent传递给startActivity(),系统可以启动你的activity,而用户也可以起草和发送电子邮件。

关于创建Intent过滤器的更多内容,请参阅Intents and Intent Filters文档。

Declaring app requirements(声明应用程序需求)
有好多设备安装了Android,但并不是所有的设备都提供相同的属性和功能。为了避免你的应用安装在一个不能满足你应用功能特性的设备上,在你清单文件中声明软硬件需求来明确你的应用所需要支持的功能特性是有必要的。大多数声明信息仅供参考,系统不会读取他们,但是外部的服务,如谷歌应用市场会读取它们,以便为用户在自己的设备上搜索应用程序时提供过滤作用。

例如:如果你的应用程序需要一个照相机,并使用了Android2.1(API等级7),你应该在你的清单文件中声明这些需求,像这样:
<manifest ... >
   
<uses-feature android:name="android.hardware.camera.any"
                 
android:required="true" />
   
<uses-sdk android:minSdkVersion="7" android:targetSdkVersion="19" />
    ...
</manifest>
现在,一个没有照相机,并且Android版本低于2.1的设备不能安装你的应用。
但是,您也可以声明您的应用程序使用照相机,但并不需要它。在这种情况下,你的应用程序必须设置所需要的属性为“假”,并检查在运行时的设备是否有照相机,并禁止任何拍照功能。

关于如何管理你的应用程序兼容不同设备的内容,请参阅设备兼容性(Device Compatibility)文档。

App Resources(应用程序资源)                                                
一个Android应用程序不仅仅是由代码组成,它还需要跟代码分离的资源,如:图片,音频,以及任何有关应用程序视觉呈现的东西。例如:你应该定义动画,菜单,样式,颜色,以及用XML文件定义的activity用户界面的布局。使用应用程序的资源可以很容易的更新你的应用程序的各种特性,而不用修改任何代码,通过提供两套替代资源,你可以优化你的应用程序适合不同的设备的配置(如不同的语言和不同的屏幕尺寸)。

对于您的Android项目包括的每一个资源,SDK构建工具会定义一个唯一的整 ​​数ID,您可以用来引用您的应用程序代码中的资源或其他定义在XML文件中的资源。例如,如果你的应用程序包含一个名为logo.png图像文件(保存在RES /drawable/目录下),SDK工具会为其生成一个名为 R.drawable.logo资源ID,您可以使用这个ID来引用这张图片并将其插入在您的用户界面中。

提供与你的代码分开的资源的一个很重要的方面是有利于你为不同的配置的设备提供不同的资源。例如,通过定义XML UI字符串,可以翻译字符串成其他语言,并保存在不同的文件中。然后,根据你追加到资源目录名称中的限定词(如RES  res/values-fr/ 法语字符串值)和用户的语言设置,Android系统会将相应的语言字符串应用到你的UI中。

为您的替代资源Android支持很多不同的限定词限定词是一个短字符串,被包含在你的资源目录的名称中,用来明确要用到这些资源的设备的配置。再举一个例子,你应该经常为你的activity创建不同的布局,根据设备的屏幕方向和大小。例如,当设备屏幕处于纵向取向(高),则可能需要按钮垂直对齐的布局,但是当屏幕是在横向(宽),按钮应水平对齐。要根据方向来改变布局,可以定义两个不同的布局,并在布局的目录名称中使用相应的限定词。然后,系统将自动根据当前的设备方向来应用适当的布局。

关于你的应用中能包含的各种资源,及如何为各种配置的设备创建可选资源的详细内容请参阅Application Resources开发指南。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值