Android 之 AndroidManifest.xml 详解(一)

当Android启动一个应用程序组件之前,它必须知道哪些个组件是存在的,所以开发人员在开发过程中,必须将应用程序中出现的组件一一在AndroidManifest.xml文件中" 声明 ",最终这个AndroidManifest.xml文件也会被一起打包到.apk文件中去。

Android的四大组件分别是:Activity、BroadCast receiver、service、Content Provider,所以如果在程序中用到了这些组件,一定要在AndroidManifest.xml文件中" 声明 ",否则Android应用程序在运行时,在需要跳转到、或者需要用到组件时会报错:找不到。

这个manifest文件以XML作为结构格式,而且对于所有应用程序,都叫做AndroidManifest.xml。为声明一个应用程序组件,它还会做很多额外工作,比如指明应用程序所需链接到的库的名称(除了默认的Android库之外)以及声明应用程序期望获得的各种权限。

但manifest文件的主要功能仍然是向Android声明应用程序的组件。下面是一个标准的AndroidManifest.xml文件样例:

<?xml version="1.0" encoding="utf-8"?>
<manifest>

    <!-- 基本配置 -->
    <uses-permission />
    <permission />
    <permission-tree />
    <permission-group />
    <instrumentation />
    <uses-sdk />
    <uses-configuration />
    <uses-feature />
    <supports-screens />
    <compatible-screens />
    <supports-gl-texture />

    <!-- 应用配置 -->
    <application>

        <!-- Activity 配置 -->
        <activity>
            <intent-filter>
                <action />
                <category />
                <data />
            </intent-filter>
            <meta-data />
        </activity>

        <activity-alias>
            <intent-filter> . . . </intent-filter>
            <meta-data />
        </activity-alias>

        <!-- Service 配置 -->
        <service>
            <intent-filter> . . . </intent-filter>
            <meta-data/>
        </service>

        <!-- Receiver 配置 -->
        <receiver>
            <intent-filter> . . . </intent-filter>
            <meta-data />
        </receiver>

        <!-- Provider 配置 -->
        <provider>
            <grant-uri-permission />
            <meta-data />
        </provider>

        <!-- 所需类库配置 -->
        <uses-library />

    </application>

</manifest>

从以上示例代码中,可以看出Android配置文件采用XML作为描述语言,每个XML标签都不同的含义,大部分的配置参数都放在标签的属性中。

各标签的使用:

[1]<manifest>...</manifest>:是AndroidManifest.xml配置文件的根元素,必须包含一个<application>元素并且指定xlmns:android和package属性。

(1)xlmns:android:指定了Android的命名空间,默认情况下是“http://schemas.android.com/apk/res/android”;

(2)package:是标准的应用包名,也是一个应用进程的默认名称;

(3)android:versionCode:是给设备程序识别版本用的,必须是一个整数值代表app更新过多少次;而

(4)android:versionName:则是给用户查看版本用的,需要具备一定的可读性,比如“1.0.0”这样的。

[2]<uses-permission />

为了保证Android应用的安全性,应用框架制定了比较严格的权限系统,一个应用必须声明了正确的权限才可以使用相应的功能。<uses-permission>就是我们最经常使用的权限设定标签,我们通过设定android:name属性来声明相应的权限名相关代码如下。

    <!-- 网络相关功能 -->
    <uses-permission android:name="android.permission.INTERNET" />  //允许网络访问    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />  //允许网络数据获取
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <!-- 读取电话状态 -->
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    <!-- 通知相关功能 -->
    <uses-permission android:name="android.permission.VIBRATE" />    <!-- 读写sd卡文件 -->    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />    <!-- 允许使用相机 -->    <uses-permission android:name="android.permission.CAMERA" />

[3]<permission />

权限声明标签,定义了供给<uses-permission>使用的具体权限,通常情况下我们不需要为自己的应用程序声明某个权限,除非需要给其他应用程序提供可调用的代码或者数据,这个时候你才需要使用<permission>标签。还可以和<permission-group>以及<permission-tree>配合使用来构造更有层次的、更有针对性权限系统。<

(1)android:name:权限名标签;

(2)android:icon:权限图标;

(3)android:description :权限描述等属性。

<permission>标签语法范例如下:

<permission android:description="string resource"
    android:icon="drawable resource"
    android:label="string resource"
    android:name="string"
    android:permissionGroup="string"
    android:protectionLevel=["normal" | "dangerous" | "signature" | "signatureOrSystem"] />

[4]<instrumentation />

用于声明Instrumentation测试类来监控Android应用的行为并应用到相关的功能测试中。另外,我们需要注意的是Instrumentation对象是在应用程序的组件之前被实例化的,这点在组织测试逻辑的时候需要被考虑到。

(1)android:functionalTest:测试功能开关;

(2)android:handleProfiling:profiling调试功能开关;

(3)android:targetPackage:测试用例目标对象。

<instrumentation>标签语法范例如下。

<instrumentation android:functionalTest=["true" | "false"]
    android:handleProfiling=["true" | "false"]
    android:icon="drawable resource"
    android:label="string resource"
    android:name="string"
    android:targetPackage="string" />

[5]<uses-sdk>

用于指定Android应用中所需要使用的SDK的版本,语法范例如下。

<uses-sdk     android:minSdkVersion="integer"    //最低版本号
    android:targetSdkVersion="integer"    //目标版本号
    android:maxSdkVersion="integer"    //最高版本号     />

[6]<uses-configuration>与<uses-feature>

这两个标签都是用于描述应用所需要的硬件和软件特性,以便防止应用在没有这些特性的设备上安装。<uses-configuration>标签中,比如有些设备带有D-pad或者Trackball这些特殊硬件,那么android:reqFiveWayNav属性就需要设置为true;而如果有一些设备带有硬件键盘,android:reqHardKeyboard也需要被设置为true。另外,如果设备需要支持蓝牙,我们可以使用<uses-feature android:name="android.hardware.bluetooth" />来支持这个功能。这两个标签主要用于支持一些特殊的设备中的应用,两个标签的语法范例分别如下。

<uses-configuration     android:reqFiveWayNav=["true" | "false"]
    android:reqHardKeyboard=["true" | "false"]
    android:reqKeyboardType=["undefined" | "nokeys" | "qwerty" | "twelvekey"]
    android:reqNavigation=["undefined" | "nonav" | "dpad" | "trackball" | "wheel"]
    android:reqTouchScreen=["undefined" | "notouch" | "stylus" | "finger"] />

<uses-feature     android:name="string"
    android:required=["true" | "false"]
    android:glEsVersion="integer" />

[7]<uses-library>

用于指定Android应用可使用的用户库,除了系统自带的android.app、android.content、android.view和android.widget这些默认类库之外,有些应用可能还需要一些其他的Java类库作为支持,这种情况下我们就可以使用<uses-library>标签让ClassLoader加载其类库供Android应用运行时用。<uses-library>标签的用法很简单,以下是语法范例。

<uses-library     android:name="string"    //类名
    android:required=["true" | "false"] />

注意:当运行Java程序时,首先运行JVM(Java虚拟机),然后再把Java类加载到JVM里头运行,负责加载Java类的这部分就叫做ClassLoader。当然,ClassLoader是由多个部分构成的,每个部分都负责相应的加载工作。当运行一个程序的时候,JVM启动,运行BootstrapClassLoader,该ClassLoader加载java核心API(ExtClassLoader和AppClassLoader也在此时被加载),然后调用ExtClassLoader加载扩展API,最后AppClassLoader加载CLASSPATH目录下定义的Class,这就是一个Java程序最基本的加载流程。

[8]<supports-screens>

对于一些应用或者游戏来说,只能支持某些屏幕大小的设备或者在某些设备中的效果比较好,我们就会使用<supports-screens>标签来指定支持的屏幕特征。
<supports-screens>标签的语法范例如下:

<supports-screens     android:resizeable=["true"| "false"]    //自适应屏幕
    android:smallScreens=["true" | "false"]    //小屏
    android:normalScreens=["true" | "false"]   //中屏
    android:largeScreens=["true" | "false"]    //大屏
    android:xlargeScreens=["true" | "false"]    //特大屏
    android:anyDensity=["true" | "false"]    //按屏幕渲染图像
    android:requiresSmallestWidthDp="integer"    //最小屏幕宽度
    android:compatibleWidthLimitDp="integer"
    android:largestWidthLimitDp="integer"/>

[9]<application>

应用配置的根元素,位于<manifest>下层,包含所有与应用有关配置的元素,其属性可以作为子元素的默认属性,将会影响应用下的所有组件。很多属性为组件设置了默认值。有些属性设置了全局值并且不能被组件修改。

以下是语法范例:

<application android:allowClearUserData=["true" | "false"]
             android:allowTaskReparenting=["true" | "false"]
             android:backupAgent="string"
             android:debuggable=["true" | "false"]
             android:description="string resource"
             android:enabled=["true" | "false"]
             android:hasCode=["true" | "false"]
             android:icon="drawable resource"
             android:killAfterRestore=["true" | "false"]
             android:label="string resource"
             android:manageSpaceActivity="string"
             android:name="string"
             android:permission="string"
             android:persistent=["true" | "false"]
             android:process="string"
             android:restoreAnyVersion=["true" | "false"]
             android:taskAffinity="string"
             android:theme="resource or theme" >
        . . .
</application>

(1)android:allowClearUserData:是否给以用户删除用户数据的权限,[true|false]。

(2)android:allowTaskReparenting:应用定义的activities是否可以被从启动的任务转移到和他有相同并且将被带到前台的任务,[true|false]。

(3)android:backupAgent:实现应用的备份代理的类名,BackupAgent的子类。这个属性的名称应该是全限定类名(如,"com.project.MyBackupAgent")。

但是,如果名称的首字母被设置为点号,也可以为类名(如,".MyAndroid"),他将被追加到在<manifest>元素中定义的包名后。没有默认值。

(4)android:debuggable:应用是否可以使用debug,甚至运行在用户模式下,[true|false]。

(5)android:description:用户可读的,比应用标签更长、更多的应用描述。此值必须是一个引用字符串。不像标签,他不能被设置为硬编码字符串。没有默认值。

(6)android:enabled:Android系统是否可以实例化应用的组件,[true|false]。如果为true时,每个组件的enabled属性决定了此组件是否可用。如果为false,他重写了组件指定值,所有的组件将不能用。默认为true。

(7)android:hasCode:应用是否包含代码,[true|false]。当值为false时,在启动组件是系统不会试着加载应用的任何代码。默认为true。

(8)android:icon:整个应用的图标,还是每个组件的默认图标。这个属性值必须被设置为drawable资源的引用。没有默认值。

(9)android:killAfterRestore:在执行系统重置操作中,当他的设置被重置后,应用是否应该被终止。单个包的重置操作不会引起应用被关闭。整个系统的恢复操作仅代表性的发生一次,当变化第一次被设置时。第三方应用将不会经常使用此属性。默认值为true,意思是,当整个系统被恢复时,应用运行完他的数据后,将会终止。

(10)android:label:一个易读的应用标签,并且还是应用的每个组件的默认标签。这个标签应该被设置为引用字符串资源,当然他也可以像其他字符串一样在用户

接口中指定。在应用开发时,可以被设置未定义字符串。

(11)android:manageSpaceActivity:一个Activity子类的全限定名称,这个Activity可以被系统启动让用户管理此应用占有的存储空间。这个Activity也应该用<activity>元素声明。

(12)android:name:为这个应用实现的Application子类的全限定名称。当应用启动时,这个类将在应用的其他组件之前被实例化。这个子类是可选的;大多数应用不需要。在缺省时,Android使用基本Application类的实例。

(13)android:permission:用户为了和应用交互必须设置的许可的名称。这个属性是一个便利的途径为应用的组件设置许可。他可以被组件的permission属性重写。

(14)android:persistent:应用是否在所有时间下都保持运行,[true|false]。默认为false。通常情况下不应该设置此标识。持久模式仅仅被几个系统应用指定。

(15)android:process:为应用下的组件定一个运行进程名称。每个组件可以定义自己的进程名称通过设置自己的process属性。在默认情况下,当应用的第一个组件需要运行时,Android为应用创建一个进程。所有的组件在同一个进程下运行。这个进程的名称和在<manifest>元素设置的backage属性名相同。

通过设置这个属性在可以在其他应用中共享,你可以协调应用的组件在同一个进程中运行,但是只有两应用也共享用户ID和签订相同的证书。

如果这个属性的名称一个冒号(":")开始,一个新的私有的进程将被创建。如果一个进程的名称以小写字母开头,一个公共的进程将被创建。一个公共的进程可以被其他应用共享,来减少资源的使用。

(16)android:restoreAnyVersion:表明这个应用准备尝试恢复所有的备份数据集合,甚至如果备份数据是比当前安装的应用高的编号存储的。设置为true将允许备份管理者去尝试恢复当版本不匹配,意思是数据冲突。要小心使用。默认为false。

(17)android:taskAffinity:提供给应用下所有组件的类同名称,除了设置了自己的taskAffinity属性的组件。默认情况下所有的组件使用相同的affinity。Affinity的名称和在<manifest>元素中设置的包名相同。

(18)android:theme:为应用下的组件定义一个引用自样式资源的主题。activity也可以设置自己的主题,通过设置自己的theme属性。

时间: 2024-10-28 11:49:02

Android 之 AndroidManifest.xml 详解(一)的相关文章

Android——TextView属性XML详解

Android_TextView属性XML详解 博客分类: android Java代码   属性名称    描述 android:autoLink    设置是否当文本为URL链接/email/电话号码/map时,文本显示为可点击的链接.可选值(none/web/email/phone/map/all) android:autoText    如果设置,将自动执行输入值的拼写纠正.此处无效果,在显示输入法并输入的时候起作用. android:bufferType  指定getText()方式取

Android Androidmanifest.xml详解(转)

一.关于AndroidManifest.xml AndroidManifest.xml 是每个android程序中必须的文件.它位于整个项目的根目录,描述了package中暴露的组件(activities, services, 等等),他们各自的实现类,各种能被处理的数据和启动位置. 除了能声明程序中的Activities, ContentProviders, Services, 和Intent Receivers,还能指定permissions和instrumentation(安全控制和测试)

AndroidManifest.xml详解

AndroidManifest.xml 是每个android程序中必须的文件. 它位于整个项目的根目录,描述了package中暴露的组件(activities, services, 等等), 除了能声明程序中的Activities, ContentProviders, Services, 和Intent Receivers,还能指定permissions和instrumentation(安全控制和测试) 二.AndroidManifest.xml结构 1 2 3 4 5 6 7 8 9 10 1

AndroidManifest.xml 详解

第1部分 标签库+包路径+版本控制 <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.bang.app" android:versionCode="1" android:versionName="1.0" > 知识点1 ① xmlns:android="http://schemas.andro

【AndroidManifest.xml详解】Manifest属性之sharedUserId、sharedUserLabel

http://blog.csdn.net/wirelessqa/article/details/8581652 android:sharedUserId 当APK安装的时候,userid这个标志就会产生.APK在设备上的整个生命周期中,这个ID不再改变.不同设备上同一个应用包可能有不同的userid,重要的是在给定的设备上,每个应用包有自己独立的userid. userid的特点: 1. 作为APK身份的标识 2. userid对应一个Linux用户,所以不同APK(用户)间互相访问数据默认是禁

Android四大组件--Activity详解

Android四大组件--Activity详解 分类: android android应用android开发 本文的主要内容包括1.activity的建立.配置和使用:2.activity的跳转和传值:3.startActivityForResult:4.activity的生命周期. 1.activity的建立.配置和使用 Activity是一个应用中的组件,它为用户提供一个可视的界面,方便用户操作,比如说拔打电话.照相.发邮件或者是浏览地图等.每个activity会提供一个可视的窗口,一般情况

Android APK反编译详解(转)

转自:http://blog.csdn.net/ithomer/article/details/6727581 这段时间在学Android应用开发,在想既然是用Java开发的应该很好反编译从而得到源代码吧,google了一下,确实很简单,以下是我的实践过程. 在此郑重声明,贴出来的目的不是为了去破解人家的软件,完全是一种学习的态度,不过好像通过这种方式也可以去汉化一些外国软件.   本文Android反编译教程,测试环境: Win7 Ultimate x64 Ubuntu 12.04 x86_x

Android APK反编译详解(附图) (转至 http://blog.csdn.net/ithomer/article/details/6727581)

本文Android反编译教程,测试环境: Win7 Ultimate x64 Ubuntu 12.04 x86_x64 反编译工具包 下载 (2012-10-10更新) 一.Apk反编译得到Java源代码 下载上述反编译工具包,打开apk2java目录下的dex2jar-0.0.9.9文件夹,内含apk反编译成java源码工具,以及源码查看工具. apk反编译工具dex2jar,是将apk中的classes.dex转化成jar文件 源码查看工具jdgui,是一个反编译工具,可以直接查看反编译后的

Android 开发 之 Fragment 详解

作者 : 韩曙亮 转载请著名出处 : http://blog.csdn.net/shulianghan/article/details/38064191 1. Fragement 概述 Fragement 与 Activity 生命周期关系 : Fragement 嵌入到 Activity 组件中才可以使用, 其生命周期与 Activity 生命周期相关. -- stop 与 destroy 状态 : Activity 暂停 或者 销毁的时候, 其内部嵌入的所有的 Fragement 也会执行