Wen

Android Manifest和XML的应用

每个Android App都需要一个配置文件告诉它一些基本的信息,它在每个app源代码的根目录下,虽然这个文件一般不会被经常改到但每项设置都至关重要,这个文件就是AndroidManifest.xml文件。

XML介绍

首先这是一个xml文件,先来简单介绍下xml语言。xml是一个描述数据或者属性的语言,比如下面一段代码

1
2
3
4
5
6
7
<?xml version="1.0" encoding="UTF-8"?>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>

我们就可以认为这个xml记录了一个叫note的东西,这里就称这种东西为节点吧。note有四种属性,“to”这个属性的值是”Tove”, “from”这个属性的值是“Jani”, 后面也是这样来看。编译器到时候就会一项一项地读取这个文件都记录了哪些节点,每个节点又有那些属性,然后它们的值又是什么,来做相应的操作。在android app中,很多前端界面的设计,比如layout 和 style等都是用xml文件来写的。

AndroidManifest初探

下面是一个简单的例子,在这个AndroidManifest.xml文件中,都有哪些节点和哪些属性需要设定呢?这个可以参考google给的官方doc,入门的话我们只需要先了解其中的几种最基本的就好了,后面的用到了再去搜文档。先看一个例子,下面是一个简单典型的AndroidManifest.xml文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.lecture"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="11"
android:targetSdkVersion="17" />
<application
android:icon="@drawable/logo"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.MainActivity"
android:label="@string/app_name"
android:screenOrientation="portrait" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>

只要搞懂这个文件,就可以应付大部分app的manifest文件了。一行一行的看,首先是一个大节点,叫manifest,这个节点在每个manifest文件都是存在且唯一存在的,后面那句xmlns:anrdoid算是这个节点的一个属性,它定义了Android Namespace, 意思是,以后出现android:的时候,就用后面那个网址代替,比如下面有一个 android:versionName="1.0", 实际xml会转换成 http://schemas.android.com/apk/res/android:versionName="1.0"。一般来说,这个网址编译器不会去访问,只是用来标识这个namaspace的唯一性,自己定义的namespace网址可以自己写,但android的这个网址不能更改。

这个大节点的第二个属性叫package,这是app的package name,也是app的唯一标识码了,以后发布app的时候也是用这个。versionName是定义版本号。

这个大节点下又有两个小的子节点,像树形结构一样。第一个子节点是uses-sdk,它是说本app需要手机安装哪个版本的sdk,这个节点不是must但一般要注明。它的第一个属性minSdkVersion是说本app支持的最低sdk,指定了之后如果你在app的代码中调用了高sdk才有的方法,IDE就会给出出错提示。targetSdkVersion是说本app就是在这个sdk环境下开发的,系统不用对它作任何的兼容性优化。

第二个子节点是application,这个节点是一定要有的,可以看到它紧接着的三个属性分别定义了它的图标(就是这个app的图标),标签(这个app的名字)和theme(app的主题,可以当成是一个定义了各种style的css文件,比如背景颜色大小等信息)。至于它们的值为什么是@xxx/xxx的格式,下一节讲。

然后application又有一个子节点叫activityactivity就像是界面和用户之间所有交互的载体,比如界面的创建,用户动作的捕捉等活动。这里只定义了一个叫com.example.MainActivity的activity的基本信息,注意这个名字,说明在app的workspace下,一定要有一个叫MainActivity.java的文件在com.example这个package下。screenOrientation是定义了这个app是横屏展示还是竖屏展示,如果想知道都有哪些值可以选择,可以参考google的anrdoid文档。下面是一个intent-filter,作用主要是当本app被其他app打开时,系统知道去运行哪个activity,具体intent-filter的用法本入门教程就不介绍了。

XML在Android中的应用

继续看在上一篇文章里出现的代码:

1
2
3
4
5
<application
android:icon="@drawable/logo"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
......

看完上一篇文章我们都知道这三句话设置了app的iconlabeltheme这三个属性,那么后面的赋值语句是什么意思呢?为什么是@xxx/yyy的格式?@后紧跟的是Resource Types/后面的是前面标签下叫那个名字的值。比如@xxx/yyy意思就是符合xxx类型并且名字叫yyy的Resource的值。看下面这张截图,某个android project的文件结构。

res文件夹下是这个project的所需的资源文件,包括各种图片、字符串、界面的布局设置等等,其他的比如src文件夹下存的是java源代码,gen文件夹下是res里的资源文件产生的让java能访问到的code。

继续看这个截图,在values文件夹下有这么几个文件,一般colors.xml放的是自己定义的颜色,dimens.xml放的是各种size的大小具体值,strings.xml放的是字符串,styles.xml放的就是layout的style文件,类似与css。来看一下strings.xml吧.

1
2
3
4
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">CustomExampleAppName</string>
</resources>

可以看到string标签下一个叫app_name的string的值是“CustomExampleAppName”,对应于最上面的AndroidManifest.xml的代码:

1
2
3
4
<activity
android:name="com.example.MainActivity"
android:label="@string/app_name"
...

这样其实就把“CustomExampleAppName”赋值给了label。其他的情况同理。唯一特别的是所有图片放到drawable文件夹下,那么这些图片自动具有drawable标签,名字叫就是它们的文件名(不包括扩展名)。

Intent Filter

上节遗留的一个问题,就是在AndroidManifest.xml里,activity的标签下,有个intent-filter标签。Intent在android里是一个class,它的主要作用是用来创建app的核心组件(activity,services,broadcast receivers),这些核心组件要先用这些Intent声明自己自己的一些属性。这里举个简单的例子。

1
2
3
4
5
6
7
8
9
<activity
android:name="MainActivity"
android:configChanges="orientation|screenSize|screenLayout"
>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

最常见的应该就是这两个了,一个是action, 这里设置成了android.intent.action.MAIN,意思是这个activity是一个主要进入点,不需要intent的其他信息就可以直接start。另一个是category,一般设成CATEGORY_DEFAULT,这样才能在java程序中用startActivity()调用。这里设成LAUNCHER是说这个app启动的时候就执行这个activity。具体其他的设置请参考安卓官方文档。

其实如果app不需要和别的app交互,这个文件用到的并不多,但这些基本的知识也要知道,以后需要什么可以再查安卓的文档。

转载请注明出处:http://zhaowen.io/post/Android_Manifest_Introduction/