在上一篇文章,我们探讨了如何搭建Android的开发环境,并分析了Android的应用架构和其中的几个核心概念,今天将探讨下如何从一个简单的HelloWorld示例来分析下Android应用程序的五脏(核心的模块知识)。
首先回顾下开发HelloWorld程序的过程。
简要描述如下:新建一个Android项目,给出项目名,选择SDK,应用程序名,包名,Activity名(屏幕名),指定最低的SDK版本,是否创建TEST项目(可选),点击完成,就可以看到生成的Android项目了。
一、应用程序结构分析
下图是刚创建的项目结构图:
下面进行简单的解释。
(1)src:项目的源文件存放的目录,如其中的HelloWorldActivity。
(2)gen:目录中存放所有自动生成的文件。
R.java 这个文件是自动产生的。它会由 ADT 插件自动根据你放入 res 目录的 XML 描述文件、图像等资源,同步更新修改 'R.java' 这个文件中。这个文件在所有应用程序中都存在,且名称避免被修改。R.java 中自动产生的「R」 类别就像是个字典一样,包含了使用者介面、图像、字串等各式的资源与相应的编号(id)。Android 应用程式中很多时候会需要透过 R 类别调用资源。编译时编译器也会查看这个资源列表,没有使用到的资源就不会编译进去,为手机应用程式节省不必要没用的空间
(3)res:存放资源文件的目录,包括布局文件main.xml,还有文本值文件strings.xml。Android 针对放在「res」 目录下的不同子目录的资源,会有各自不同处理方式。因此写代码时,最好能搞清楚各目录下分别可放置的内容。
(3-1)layout:简单理解就是布局设置。被编译为屏幕布局(或屏幕的一部分)的XML文件。
(3-2)values:可以被编译成很多种类型的资源的XML文件。strings.xml定义字符串(string)值。使用Resources.getString()或者Resources.getText()获取这些资源。getText()会保留在UI字符串上应用的丰富的文本样式。
注意: 不像其他的res/文件夹,它可以保存任意数量的文件,这些文件保存了要创建资源的描述,而不是资源本身。XML元素类型控制这些资源应该放在R类的什么地方。
(4)android包:SDK的Jar包
(5)assets:Android除了提供/res目录存放资源文件外,在/assets目录也可以存放资源文件,而且/assets目录下的资源文件不会在R.java自动生成ID,所以读取/assets目录下的文件必须指定文件的路径。我们可以通过AssetManager类来访问这些文件。
(6)AndroidManifest.xml:它是每一个应用都需要的文件,位于应用根目录下,它描述了程序包的全局变量, 包括暴露的应用组件(activities, services等等)和为每个组件的实现类,什么样的数据可以操作,以及在什么地方运行。
主要包括以下各个元素。
A.包名(package):指定本应用内java主程序包的包名。当没有指定apk的文件名时,编译后产生程序包将以此命名。本包名应当在Android系统运行时唯一。
B.认证(certificate):指定本应用程序所授予的信任级别,目前有的认证级别有platform(system)、shared、media以及应用自定义的认证。不同的认证可以享受不同的权限。
C.权限组(permission-group):权限组的定义是为了描述一组具有共同特性的权限。
D.权限(permission):权限用来描述是否拥有做某件事的权力。Android系统中权限是分级的,前分为普通级别(Normal),危险级别(dangerous),签名级别(signature)和系统/签名级别(signature or system)。系统中所有预定义的权限根据作用的不同,分别属于不同的级别。对于普通和危险级别的权限,我们称之为低级权限,应用申请即授予。其他两级权限,我们称之为高级权限或系统权限,应用拥有platform级别的认证才能申请。当应用试图在没有权限的情况下做受限操作,应用将被系统杀掉以警示。系统应用可以使用任何权限。权限的声明者可无条件使用该权限。
E.权限树(permission-tree)权限树的设置是为了统一管理一组权限,声明于该树下的权限所有者归属该应用。系统提供了API,应用可以在运行时动态添加。 PackageManager.addPermission()
F.使用权限(uses-permission):应用需要的权限应当在此处申请,所申请的权限应当被系统或某个应用所定义,否则视为无效申请。同时,使用权限的申请需要遵循权限授予条件,非platform认证的应用无法申请高级权限。
G:SDK(uses-sdk):标识本应用运行的SDK版本。高兼容性的应用可以忽略此项。
H.application:application是Android应用内最高级别(top level)的模块,每个应用内最多只能有一个application,如果应用没有指定该模块,一个默认的application将被启用。application将在应用启动时最先被加载,并存活在应用的整个运行时生命周期。因此一些初始化的工作适合在本模块完成. Application元素有许多属性,其中:“persistent”表示本应用是否为常驻内存,“enable”表示本应用当前是否应当被加载。
(7)default.properties:记录项目中所需要的环境信息,比如Android的版本等。