原文地址:http://developer.android.com/guide/components/fundamentals.html
android应用程序一旦装进设备,每个程序会在它自己安全的沙盒里运行。
1.android操作系统是一个多用户linux系统,每一个应用程序是一个用户。
2.默认情况下,系统会为每个app分配唯一的linux用户id(这个id只会被系统使用,并且只会被这个app知道),系统为每个app的所有文件都设置了权限,只有被分配了这个app用户ID的程序可以访问它。
3.每个进程有它自己的VM,一个app的代码和其他的是隔离运行的。
4.默认情况下,每个app运行在它自己的liunx进程下。当app的任何一个组件需要被执行的时候,android会开启进程,当它不在需要或者系统必须为其他app恢复内存时,进程就会被关闭。
android用这种方法,实现了最少特权原则。那就是:每个app默认情况下只能访问它需要的控件来工作而不需要其他多余的。这样创建了一个非常安全的环境:app不能访问系统其他未被授权的部分。
但是,有些方法可以用来和其他app共享数据和访问系统服务:
1.安排两个app来共享相同的linux用户ID是可以的,这种情况下他们可以访问各自的文件,为了保持系统资源,拥有相同userID的app可以在一个linux进程中运行并共享一个VM(应用必须使用相同的证书)。
2.一个app可以请求权限来访问设备数据,比如用户联系人,短信等。所有的app权限必须在应用被安装的时候被用户确认。
以上解释app存在于系统的基本信息,本文档剩余内容向你介绍:
1.在你app中定义的核心框架组件。
2.声明组件并且要求设备特征的manifest文件。
3.那些从你app代码中分离的资源,允许你的程序要优雅地优化其行为的各种设备的配置。
APP组件
app组件是android应用的基本
Activities,Services(后天长时间的运行或为远程进程工作),ContentPrivider,Broadcast receiver.
当系统start一个组件,那系统会为那个app start一个进程(若还没运行),而且实例化那个组件需要的类,比如:当你的应用想通过系统照相来得到照片,那么进程中跑得activity是属于Camera app的而不是你的app的。因此,不想其他的大部分系统,Android应用没有一个入点(比方说main()).
激活的组件
Manifest文件
在android系统开始一个组件前,系统在读manifest文件时必须知道该组件存在。你的app必须在这个存在于app工程根目录的文件中声明所有的组件。
声明组件能力
比如:你想创建一个email应用,你可以声明一个intent filter来响应send 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>然后,如果另一个app创建一个携带ACTION_SEND的intent而且传给startActivity(),此时系统也许会启动你的activity,这样用户就可以拖拽和发邮件了。
声明app需求
为了保护你的应用程序能被安装在那些缺少你的app必须的特征的设备上,你通过在manifest文件中明确的声明一个你的应用可以安装在哪些设备上的简介是非常重要的。大多数的信息系统都不会读取,但是外部的设备比如Google play为了那些从自己设备搜索app的用户提供过滤。
比如你的应用需要一个照相机而且需要Android2.1,你应该在你的manifest文件中这样声明:
<manifest ... > <uses-feature android:name="android.hardware.camera.any" android:required="true" /> <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="19" /> ... </manifest>这时候,那些没有照相机,而且Android版本低于2.1的设备就不能从Googleplay安装你的应用。
但是,当你的应用使用camera但不是必须拥有一个Camera,这时候你应将 required 这个属性设置为false.而且在运行时判断时候于camera,适当的禁止任何相机的特征。
App资源
从代码中分离开来来提供资源的一个重要方面是能使你给不同的设备配置提供可选的资源。比如在xml中定义UI Strings你可以将文字翻译成不同的语言并保存到分离的文件中