Android SDK工具把代码(包括数据和资源文件)编译成一个android包,以.apk为后缀。.apk文件就是一个应用,可以安装到android驱动的设备上。
一旦被安装到设备上,每个android应用都存活在它自己的安全沙箱里面:
·android操作系统是一个多用户的操作系统,每一个应用都是一个用户。
·默认的,系统指定每一个应用一个Linux user ID(这个应用不知道这个ID,这个ID只能被系统使用)。系统给一个应用的所有文件设置了权限,只有被赋予了这个应用的user ID 的应用可以以访问他们。
·每个进程运行在它自己的VM里,所以每一应用都与其他应用相互独立的运行。
·默认的,每个应用都运行在它自己的进程里。当一个应用的任何一个组件被执行时,Android启动这个组件属于的进程;当应用不需要时或需要更多的空间给其它应用时,这个进程就被关闭。
一个应用可以和其他应用共享数据,一个应用也可以访问系统服务。
·当两个应用共享一个Linux user ID是,它们可以互相访问数据和文件。有相同user ID的应用可以运行在一个进程里并且共享相同的VM(这些应用必须有相同的证书)。
·一个应用可以请求权限去访问设备的数据,如联系人、SMS消息、SD卡、摄像机、蓝牙等。所有的权限都必须在安装是被授予。
应用组件
应用组件是android应用的必须构建模块。有四种组件Activity、Services、Content Provider、Broadcast Receiver。
·Activity:一个activity代表了一个单独的用户界面。一个应用也可以启动一个不属于它的activity(如果允许的话)。
·Service:一个service是一个运行在后台的执行长时间操作或执行远程处理的组件。Service不需要用户界面。一个activity可以启动一个service并让它运行,或绑定一个service以便和它交互。
·Content Provider:一个Content Provider管理一套共享的应用数据集。可以把数据存储在文件系统、SQLite数据库、web或你的应用可以访问的其它持久存储区域。通过Content Provider,其它应用可以查询和修改数据。例如android系统提供了一个Content Provider来管理用户的联系人信息,那么其它的应用就可以通过合适的权限来查询Content Provider的一部分来读写一个特定的联系人的信息。
·Broadcast Reciver:一个Broadcast Reciver是用来响应系统级别的广播通知的。很多都是由广播引起的。广播不显示用于界面,可以创建一个状态条来广播。
一个应用可以使用其他的应用来为自己服务。如在自己的应用里要照相,只需调用已有的照相应用即可,不用自己去写一个独立的activity去照相。
当在自己的应用里启动照相程序是,它们属于不同的进程。
Android应用程序有很多进入点,没有单独的进入点(如main())。
每个应用运行在独立的拥有文件权限的进程里,并且限制访问其他的应用。你的应用不能直接访问其他应用的组件,系统却可以。所以,可以发送一个指定了要启动的组件intent消息给系统,通过系统为你启动那个组件。
激活组件
Activity、service、broadcast receiver通过intent来激活,content provider 通过ContentResolver激活。
·通过startActivity()或startActivityForResult()来启动activity。
·通过startService()或bindService()来启动service。
·通过sendBroadcast()、sendOrderedBroadcast()或sendStickyBroadcast()启动广播。
·通过ContentResolver的query()来查询content provider。
Manifest文件
在系统启动应用组件之前,系统通过AndroidManifest.xml文件来获知应用存在哪些组件。必须在这个文件中指定这个所有的组件。
Manifest文件的功能:
·标识了这个应用的所有用户权限。
·声明了这个应用的最小应用等级。
·声明了硬件和软件需求。
·应用所需要的库。
Manifest文件最主要的功能就是告诉系统一个应用的所有组件。<activity>、<service>、<receiver>、<provider>。广播可以动态的在代码里创建(如BroadcastReceiver),然后通过registerReceiver()注册到系统里。
声明组件的功能
通过<intent-filter>元素声明一个组件拥有的功能。
声明应用需求
·屏幕大小和保真度
·输入配置
·设备功能
应用资源
把资源和代码分开。