Android官方文档—APP清单(概述)

APP清单文件

每个应用程序必须在其根目录中包含一个AndroidManifest.xml文件(具有该名称)。清单文件向Android系统提供有关您的应用程序的基本信息,系统在运行任何应用程序代码之前必须具备这些信息。

除其他外,清单文件执行以下操作:

  • 它为应用程序命名Java包。包名称用作应用程序的唯一标识符。
  • 它描述了应用程序的组件,包括组成应用程序的活动,服务,广播接收器和内容提供程序。它还命名实现每个组件的类并发布它们的功能,例如它们可以处理的Intent消息。这些声明通知Android系统组件及其启动条件。
  • 它确定承载应用程序组件的进程。
  • 它声明了应用程序必须具有的权限,以便访问API的受保护部分并与其他应用程序交互。它还声明了其他人需要具有的权限才能与应用程序的组件进行交互。
  • 它列出了Instrumentation类,它们在应用程序运行时提供分析和其他信息。只有在开发应用程序时才会在清单中显示这些声明,并在应用程序发布之前将其删除。
  • 它声明了应用程序所需的最低Android API级别。
  • 它列出了应用程序必须链接的库。

注意:在准备Android应用程序以在Chromebook上运行时,您应该考虑一些重要的硬件和软件功能限制。有关详细信息,请参阅适用于Chromebook的App Manifest Compatibility文档。

清单文件结构


下面的代码片段显示了清单文件的一般结构以及它可以包含的每个元素。每个元素及其所有属性都在一个单独的文件中完整记录。

提示:要查看有关本文档文本中提到的任何元素的详细信息,只需单击元素名称即可。

以下是清单文件的示例:

<?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>

以下列表包含可以按字母顺序显示在清单文件中的所有元素:

  • <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>

注意:这些是唯一合法的元素 - 您无法添加自己的元素或属性。

文件约定


本节介绍通常适用于清单文件中所有元素和属性的约定和规则。

Elements

只需要<manifest>和<application>元素。它们必须存在且只能出现一次。大多数其他元素可以多次出现或根本不出现。但是,在清单文件变得有用之前,必须至少存在其中一些。

如果元素包含任何内容,则它包含其他元素。所有值都是通过属性设置的,而不是元素中的字符数据。

同一级别的元素通常不是有序的。例如,<activity>,<provider>和<service>元素可以按任何顺序混合。此规则有两个关键的例外情况:

<activity-alias>元素必须遵循作为别名的<activity>。

<application>元素必须是<manifest>元素中的最后一个元素。换句话说,</ application>结束标记必须紧跟在</ manifest>结束标记之前。

Attributes

在形式上,所有属性都是可选的。但是,必须指定一些属性,以便元素可以实现其目的。使用文档作为指南。对于真正的可选属性,它会提到默认值或说明在没有规范的情况下会发生什么。

除了root <manifest>元素的某些属性外,所有属性名称都以android:前缀开头。例如,android:alwaysRetainTaskState。由于前缀是通用的,因此在按名称引用属性时,文档通常会省略它。

Declaring class names

许多元素对应于Java对象,包括应用程序本身的元素(<application>元素)及其主要组件:活动(<activity>),服务(<service>),广播接收器(<receiver>)和内容提供者(<提供商>)。

如果定义子类,就像组件类(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系统会创建指定子类的实例。如果未指定子类,则会创建基类的实例。

Multiple values

如果可以指定多个值,则几乎总是重复该元素,而不是在单个元素中列出多个值。例如,intent过滤器可以列出几个操作:

<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>

Resource values

某些属性具有可以向用户显示的值,例如活动的标签和图标。应该从资源或主题中对这些属性的值进行本地化和设置。资源值以以下格式表示:

@[<i>package</i>:]<i>type</i>/<i>name</i>

如果资源与应用程序位于同一个程序包中,则可以省略程序包名称。类型是一种资源,例如string或drawable,name是标识特定资源的名称。这是一个例子:

<activity android:icon="@drawable/smallPic" . . . >

主题中的值表达方式相似,但是初始值是?代替 @:

?[<i>package</i>:]<i>type</i>/<i>name</i>

String values

如果属性值是字符串,则必须使用双反斜杠(\\)来转义字符,例如换行符为\\ n,Unicode字符为\\ uxxxx。

文件功能


以下部分描述了清单文件中反映某些Android功能的方式。

意图过滤器

应用程序的核心组件(例如其活动,服务和广播接收器)由意图激活。 intent是描述所需操作的信息包(Intent对象),包括要执行操作的数据,应执行操作的组件类别以及其他相关指令。 Android系统找到可以响应意图的适当组件,如果需要,则启动组件的新实例,并将其传递给Intent对象。

组件通告意图过滤器可以响应的意图类型。由于Android系统必须了解组件在启动组件之前可以处理的意图,因此在清单中将意图过滤器指定为<intent-filter>元素。组件可以包含任意数量的过滤器,每个过滤器都描述不同的功能。

显式命名目标组件的intent会激活该组件,因此过滤器不起作用。未按名称指定目标的intent只有在可以通过组件的某个过滤器时才能激活组件。

有关如何针对意图过滤器测试Intent对象的信息,请参阅意图和意图过滤器文档。

图标和标签

许多元素具有可以向用户显示的小图标和文本标签的图标和标签属性。有些还有一个描述属性,用于更长的解释性文本,也可以在屏幕上显示。例如,<permission>元素具有所有这三个属性,因此当询问用户是否将权限授予已请求它的应用程序时,表示权限的图标,权限的名称以及描述它所包含的内容都呈现给用户。

在每种情况下,在包含元素中设置的图标和标签将成为所有容器子元素的默认图标和标签设置。因此,<application>元素中设置的图标和标签是每个应用程序组件的默认图标和标签。同样,为组件设置的图标和标签(例如<activity>元素)是每个组件的<intent-filter>元素的默认设置。如果<application>元素设置标签,但活动及其intent过滤器不设置,则应用程序标签将被视为活动和intent过滤器的标签。

每当组件呈现给用户并完成过滤器通告的功能时,为意图过滤器设置的图标和标签表示组件。例如,具有android.intent.action.MAIN和android.intent.category.LAUNCHER设置的过滤器将活动通告为启动应用程序的活动。也就是说,应该在应用程序启动器中显示。过滤器中设置的图标和标签显示在启动器中。

Permissions

权限是限制访问部分代码或设备上数据的限制。限制是为了保护可能被滥用以破坏或破坏用户体验的关键数据和代码。

每个权限都由唯一标签标识。标签通常表示受限制的行为。以下是Android定义的一些权限:

  • android.permission.CALL_EMERGENCY_NUMBERS
  • android.permission.READ_OWNER_DATA
  • android.permission.SET_WALLPAPER
  • android.permission.DEVICE_POWER

只有一个权限知道保护一类功能。

如果应用程序需要访问受权限保护的功能,则必须声明它需要具有清单中<uses-permission>元素的权限。当应用程序安装在设备上时,安装程​​序通过检查签署应用程序证书的权限并在某些情况下询问用户来确定是否授予所请求的权限。如果授予了权限,则应用程序可以使用受保护的功能。如果没有,则在没有任何通知用户的情况下,它尝试访问这些功能会失败。

应用程序还可以使用权限保护自己的组件。它可以使用Android定义的任何权限,如android.Manifest.permission中所列,或由其他应用程序声明。它也可以定义自己的。使用<permission>元素声明新权限。例如,活动可以受到如下保护:

<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>元素请求其使用。您必须请求使用它,以便应用程序的其他组件启动受保护的活动,即使应用程序本身强加了保护。

如果在上面显示的相同示例中,权限属性设置为在其他地方声明的权限,例如android.permission.CALL_EMERGENCY_NUMBERS,则不必使用<permission>元素再次声明它。但是,仍然需要使用<uses-permission>来请求它的使用。

<permission-tree>元素声明了一组在代码中定义的权限的命名空间,<permission-group>定义了一组权限的标签,这两个权限都是在清单中使用<permission>元素声明的那些权限和那些在别处宣布。这仅影响在向用户呈现时权限的分组方式。 <permission-group>元素未指定属于该组的权限,但它为该组指定了名称。您可以通过将组名分配给<permission>元素的permissionGroup属性来在组中放置权限。

Libraries

每个应用程序都链接到默认的Android库,其中包括用于构建应用程序的基本包(使用公共类,如Activity,Service,Intent,View,Button,Application和ContentProvider)。

但是,有些软件包位于自己的库中。如果您的应用程序使用任何这些软件包中的代码,则必须明确要求将它们链接起来。清单必须包含一个单独的<uses-library>元素来命名每个库。您可以在包的文档中找到库名。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值