AndroidManifest官方文档

本文档深入介绍了AndroidManifest.xml文件的重要性及结构。它详细说明了该文件如何定义应用的组件、权限需求、使用的API级别等关键信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

https://developer.android.com/guide/topics/manifest/manifest-intro.html
https://developer.android.com/samples/BasicContactables/AndroidManifest.html

AndroidManifest简介

每个应用必须有一个AndroidManifest.xml文件(精确的按此名字)在它的根目录.manifest文件向Android系统提供关于app的基本信息,这些是系统必须在运行任何app的代码前需要知道的.

此外,清单文件还可执行以下操作:

1.它命名应用的Java包.包名作为应用的唯一标识.

2.它描述应用的组件,包括组层应用的Activities,Services,BroadcastReceivers,和ContentProviders.它也命名类实现各个组件和公布它们的能力,如它们可以处理的Intent消息.这些声明通知提供,它们可被启动的组件和条件.

3.它决定进程持有的应用组件

4.它声明应用必须拥有来去访问受保护的API部分和与其他应用交互的权限.它也声明权限,其他被要求去拥有为了与应用组件交互.

5.它列出Instrumentation类,提供分析和其他信息随着应用运行.这些声明存在于manifest中,仅当应用在开发时,并将被移除在应用发布前.

6.它声明应用要求的最小Android API等级.

7.它列出应用必须被链接依赖的库

Manifest文件结构

下面的代码片段显示manifest文件通常的结构,和它可以包含的每个元素.每个元素及其所有属性,全部记录在单独的文件中.
提示:要查看此文本中提到的任何元素的详细信息,就点击元素名.

<?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>
         <intent-filter>
         <action />
         <category />
         <data />
     </intent-filter>
     <meta-data />
      </activity>
      <activity-alias>
         <intent-filter>...</intent-filter>
     <meta-data />
      </activity-alias>
      <service>
          <intent-filter>...</intent-filter>
      <meta-data />
      </service>
      <receiver>
         <intent-filter>...</intent-filter>
     <meta-data />
      </receiver>
      <provider>
          <grant-uri-permission/>
      <meta-data />
      <path-permission />
      </provider>
      <uses-library />
  </application>
</manifest>

如下列表包含所有可以出现在manifest文件中的元素,按字母顺序:

<action>
<activity>
<activity-alias>
<application>
<category>
<data>
<grant-uri-permission>
<instrumentation>
<intent-filter>
<manifest>
<meta-data>
<permission>
<permission-group>
<permission-tree>
<provider>
<receiver>
<service>
<supports-screens>
<uses-configuration>
<uses-feature>
<uses-library>
<uses-permission>
<uses-sdk>

注意:这些是仅有的合法元素—-不可以自己添加元素和属性.

文件介绍

此段描述约定和规则,通常应用到manifest文件所有元素和属性上的.

元素:

<manifest><application> 元素是必须的.它们必须存在且仅出现一次.大多出其他元素可以出现多次或完全不出现.然而,至少它们中的一些存在,在manifest文件变为有用之前.
如果一个元素包含所有任何的,它包含其他元素.所有值设置通过属性,不是元素的数据字符.
相同等级的元素通常是无序的.例如:<activity>,<provider>,和<service>元素可以按任何顺序混合.有两个关键的例外规则:
<activity-alias>元素必须紧随在它将要别名的<activity>之后
<application>元素必须是在<manifest>元素中的最后一个元素.也就是说,</application>关闭标签必须立即出现在</manifest>关闭标签前.

属性:

按正常的意义上,所有属性都是可选的.然而,有一些属性必须被指定,让元素完成它的目标.使用文档作为导引.对于真正的可选属性,它有一个默认值或状态,当不存在于规定中时.
除了根元素的一些属性,所有属性名以android:前缀开始.例如,android:alwaysRetainTaskState.因为前缀是唯一的,文档通常忽略它,当按名称提及到属性时.

声明类名:

很多元素对应Java对象,包括应用它本身的元素(<application>元素),并且它的主要的组件:activities(<activity>),services(<service>),broadcast receivers(<receivers>),和content proivders(<provider>).
如果你定义一个子类,如你几乎总是用的组件类(Activity,Service,BroadcastReceiver,和ContentProvider),子类被声明通过一个name属性.名字必须包含全包名称.例如:一个Service子类可能被声明如下:

<manifest ...>
   <application>
          <service android:name="com.example.project.SecretService"...>
          </service>
   </application>
</manifest>

然而,如果字符串的第一个字符是一个句号,应用的包名(如由<manifest>元素指定的包属性)被添加到字符串.如下分配等同于上面的显示.

<manifest package="com.example.project"...>
        <application ...>
         <service android:name=".SecretService"...>
         </service>
    </application>
</manifest>

当开始一个组件,Android系统创建一个命名的子类实例.如果一个子类没有指定,它创建一个基类实例.

多值:

如果多于一个值被指定,元素大多总是重复的,而不是多值被列在一个单一的元素中.例如,一个inent filter
可以列出多个actions:

<intent-filter ...>
    <action android:name="android.intent.action.EDIT"/>
    <action android:name="android.intent.action.INSERT"/>
    <action android:name="android.intent.action.DELETE"/>
    ....
</intent-filter>

资源值

一些属性有值可以显示给用户,如一个activity的一个标签和一个图标.这些属性的值应该被本地化和从一个资源或主题设置.资源值按如下格式表示:
@[package:]type/name
可以忽略package名,如果资源随着应用在相同包. type是资源的类型,如string或drawable,并且name是表示指定资源的名字.此是例子:
<activity android:icon="@drawable/smallPic" ...>
来自于主题的值按相似的表示,但用?替代@初始化:
?[package:]type/name
字符串值:
当一个属性值是一个字符串,必须用双反斜杠(\\)去转换字符,如\\n用于一个新行或\\uxxxx用于一个Unicode字符.

文件特性

接下来的段描述一些反映在manifest文件中的Android特性的方式.

Intent filters

一个应用的核心组件,如它的activities,services,和broadcast receivers由intents激活.一个intent是
一个信息组合(一个Intent对象),描述一个需要的action,包括要执行的数据,应该执行行为的组件的类型,和其他相关的指令.Android系统放置一个可以响应intent的合适组件,启动组件的新实例,如果需要,并且传递它Intent对象.
组件通知intents类型,它们能响应通过intent filters.由于Android系统必须知道一个组件可以处理的intent,在它启动组件前,intent filters被指定在元素中.一个组件可以有任意数量的filters,每一个描述一个不同的能力.
一个intent明确命名要激活的一个目标组件,因此filter不能扮演角色.一个intent没有指定激活组件的一个目标名,仅当它可传递一个组件的过滤器.
对于信息,关于如何Intent对象被测试依赖于intent过滤器,参阅Intents和Intent Filters文档
[https://developer.android.com/guide/components/intents-filters.html]

图标和标签

许多元素有icon和label属性,用于小图标和文本标签显示给用户.一些有描述属性用于长的,解释性的文本,可以显示在屏幕上.例如,<permission>元素有所有这三种属性,因此当用户被要求是否获取应用要求的权限时,一个图标表示权限,权限名,和它的必要性描述全都呈现给用户.

在任何情况下,图标和标签被设置在包含元素中,变为默认icon和label设置,用于所有包含的子元素.因此,图标和标签被设置在<application>元素中的,是默认的图标和标签用于应用组件的每个元素.类似,图标和标签被设置用于一个组件,如<activity>元素,是默认设置用于每个组件<intent-filter>元素.如果<application>元素设置一个标签,但一个activity和它的intent filter没有,应用标签同时被作为activity和intent-filter的标签.

图标和标签被设置用于intent-filter表示一个组件,无论组件是否被呈现给用于,并填充功能有filter通知.例如:一个有android.intent.action.MAIN和android.intent.category.LAUNCHER设置的过滤器通知一个activity作为启动应用的.即,应该被显示在应用启动器中.被设置在过滤器中图标和标签被显示在启动器中.

权限

permission是一个限制访问设备部分代码或数据的约束条件.限制被强加到保护的关键数据和代码,可能被滥用去曲解或毁坏用户体验.

每个权限由一个唯一的标签标识.通常标签指示限制的行为.这有一些权限由Android定义:
android.permission.CALL_EMERGENCY_NUMBERS
android.permission.READ_OWNER_DATA
android.permission.SET_WALLPAPER
android.permission.DEVICE_POWER
一个特性仅由一个权限保护.

如果一个应用需要访问一个由权限保护的特性,它必须声明它要求的权限用<uses-permission>元素在manifest中.当应用被安装到设备,安装者决定是否获取请求的权限,通过检查作者签名的证书和,在一些情况下,询问用户.如果权限被获取,应用可以使用保护的权限.如果没有,它尝试去访问这些特性是被没有任何提示给用户.

应用可以用权限保护它自己的组件.它可以利用Android定义的任何权限,如在android.Manifest.permission
[https://developer.android.com/reference/android/Manifest.permission.html] 中列出的,或由其他应用声明的.
它也可以定义它自己的.一个新权限被定义用<permission>元素.例如:一个activity可以按如下保护:

<manifest ...>
    <permission android:name="com.example.project.DEBIT_ACCT"... />
    <uses-permission android:name="com.example.project.DEBIT_ACCT" />
    ...
    <application ...>
        <activity android:name="com.example.project.FreneticActivity"
              android:permission="com.example.project.DEBIT_ACCT"
          ...>
    </activity>
    </application>
</manifest>

注意,在此例子中,DEBIT_ACCT权限不仅由<permission>元素声明,它的使用也要求有<uses-permission>元素.必须要求它使用为了其他应用组件去启动保护的activity,即使保护是应用自己强加的.

如果,在上面显示的相同例子中,permission属性被设置到权限,在其他地方声明,如android.permission.CALL_EMERGENCY_NUMBERS,它不必去再一次声明<permission>元素.然而,它仍必须要求使用<uses-permission>.
<permission-tree>元素声明一组权限的名字空间,由代码定义的,并且<permission-group>定义一个标签用于权限集合,这些声明都在manifest中用<permission>元素,并且这些声明在其他地方.这影响仅对权限如何被分组,当呈现给用户时.<permission-group>元素不能指定属于组的权限,但它给组一个名字.可以放置一个权限在组中,通过分配组名到<permission>元素permissionGroup属性.

每个应用链接依赖Android默认库,这包括用于编译应用的基本包(公共类如Activity,Service,Intent,View,Button,Application,和ContentProvider).

然而,一些包驻留在它们自己的库中.如果应用使用代码从任何这些包,它必须明确要求链接依赖它们.manifest必须包含一个分离的<uses-library>元素去命名每个库.可以找到库名在包文档中.
[packages/apps/Gallery2/AndroidManifest.xml]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值