Android复习(三)清单文件中的元素——>grant-uri-permission、instrumentation、intent-filter、manifest、meta-data
<grant-uri-permission>
- 语法:
-
<grant-uri-permission android:path="string" android:pathPattern="string" android:pathPrefix="string" />
- 包含于:
<provider>
- 说明:
- 指定父内容提供程序有权访问的应用数据的子集。数据子集由
content:
URI 的路径部分指示。(URI 的权威部分标识内容提供程序。)通过授予权限,可以使通常无权访问其数据的提供程序的客户端能够一次克服该限制。如果内容提供程序的
grantUriPermissions
属性为“true
”,则可以为提供程序权限下的任何数据授予权限。不过,如果该属性为“false
”,则只能向此元素指定的数据子集授予权限。提供程序可以包含任意数量的<grant-uri-permission>
元素。每个元素只能指定一个路径(只能是三个可能属性中的一个)。如需了解权限是如何授予的,请参阅
<intent-filter>
元素的grantUriPermissions
属性。 - 属性:
android:path
android:pathPrefix
android:pathPattern
- 标识可向其授予权限的一个或多个数据子集的路径。
path
属性指定完整路径;只能授予对由该路径标识的特定数据子集的相应权限。pathPrefix
属性指定路径的初始部分;可以授予对路径共有该初始部分的所有数据子集的相应权限。pathPattern
属性指定完整路径,但可以包含以下通配符:- 星号(“
*
”)匹配出现零次到多次的紧邻前面的字符的一个序列。 -
后跟星号的句点(“
.*
”)匹配零个或多个字符的任意序列。
由于在从 XML 读取字符串时(在将其解析为模式之前)将“
\
”用作转义字符,因此您需要进行双重转义:例如,字面量“*
”将编写为“\\*
”,字面量“”将编写为“\\\\
”。这基本上与采用 Java 代码构造字符串时需要编写的内容一样。如需详细了解这些类型的模式,请参阅
PatternMatcher
类中的PATTERN_LITERAL
、PATTERN_PREFIX
和PATTERN_SIMPLE_GLOB
的说明。 - 星号(“
<instrumentation>
- 语法:
-
<instrumentation android:functionalTest=["true" | "false"] android:handleProfiling=["true" | "false"] android:icon="drawable resource" android:label="string resource" android:name="string" android:targetPackage="string" android:targetProcesses="string" />
- 包含于:
<manifest>
- 说明:
- 声明用于监控应用与系统交互的
Instrumentation
类。Instrumentation 对象在应用的所有组件之前进行实例化。 - 属性:
android:functionalTest
- Instrumentation 类是否应作为功能测试运行。如果应该,则设为“
true
”;如果不应该,则设为“false
”。默认值为“false
”。 android:handleProfiling
- Instrumentation 对象是否负责开启和关闭分析。如果该对象决定何时开始和停止分析,则设为“
true
”;如果在该对象的整个运行过程中持续进行分析,则设为“false
”。如果值为“true
”,可让该对象将分析目标设定为一组特定的操作。默认值为“false
”。 android:icon
- 一个表示 Instrumentation 类的图标。必须将此属性设为对可绘制资源的引用。
android:label
- Instrumentation 类的用户可读标签。可以将该标签设为原始字符串或对字符串资源的引用。
android:name
Instrumentation
子类的名称。此名称应该是一个完全限定类名(如“com.example.project.StringInstrumentation
”)。不过,作为一种简写形式,如果名称的第一个字符是句点,则会将其附加到<manifest>
元素中指定的软件包名称。没有默认值。必须指定相应名称。
android:targetPackage
Instrumentation
对象将针对哪个应用运行。应用由通过<manifest>
元素在其清单文件中分配的软件包名称进行标识。android:targetProcesses
-
Instrumentation
对象将针对哪些进程运行。如果以逗号分隔列表的形式列出了进程,表示将针对这些特定的进程运行插桩测试。如果值为"*"
,表示将针对在android:targetPackage
中定义的应用的所有进程运行插桩测试。如果未在清单中提供此值,将仅针对在
android:targetPackage
中定义的应用的主进程运行插桩测试。此属性是在 API 级别 26 中添加的。
<intent-filter>
- 语法:
-
<intent-filter android:icon="drawable resource" android:label="string resource" android:priority="integer" > . . . </intent-filter>
- 包含于:
<activity>
<activity-alias>
<service>
<receiver>
- 必须包含:
<action>
- 可包含:
<category>
<data>
- 说明:
- 指定 Activity、服务或广播接收器可以响应的 Intent 类型。Intent 过滤器声明其父组件的功能 - Activity 或服务可执行哪些操作,以及接收器可处理哪些类型的广播。它让组件可以接收所通告类型的 Intent,同时过滤掉对组件没有意义的 Intent。
过滤器的大部分内容由它的
<action>
、<category>
和<data>
子元素进行描述。如需详细了解过滤器,请参阅一篇单独的文档 - Intent 和 Intent 过滤器,以及简介中的 Intent 过滤器部分。
- 属性:
android:icon
- 一个表示父 Activity、服务或广播接收器的图标,在将该组件以具备过滤器所描述功能的形式呈现给用户时显示。
必须将此属性设为对包含图片定义的可绘制资源的引用。默认值为父组件的
icon
属性设置的图标。如果父组件未指定图标,则默认值为<application>
元素设置的图标。如需详细了解 Intent 过滤器图标,请参阅简介中的图标和标签。
android:label
- 父组件的用户可读标签。将相应组件以具备过滤器所描述功能的形式呈现给用户时,将使用此标签(而不是父组件设置的标签)。
应将标签设为对字符串资源的引用,以便可以像界面中的其他字符串一样进行本地化。不过,为了方便您开发应用,也可以将其设为原始字符串。
默认值为父组件设置的标签。如果父组件未指定标签,则默认值为
<application>
元素的label
属性设置的标签。如需详细了解 Intent 过滤器标签,请参阅简介中的图标和标签。
android:priority
- 就处理过滤器所描述类型的 intent 而言,应该为父组件指定的优先级。此属性对 Activity 和广播接收器都有意义:
- 它说明了某个 Activity 对与过滤器匹配的 Intent 的响应能力,这是相对于也可以响应该 Intent 的其他 Activity 的响应能力。当 Intent 可由优先级不同的多个 Activity 处理时,Android 只会将优先级值较高的 Activity 视为 Intent 的潜在目标。
-
它控制按什么顺序执行广播接收器以接收广播消息。优先级值越高,调用顺序越靠前。(该顺序仅适用于同步消息;对于异步消息,系统会忽略该顺序。)
只有在您确实需要对接收广播施加特定顺序或想要强制 Android 优先选用某个 Activity 时,才能使用此属性。
值必须是一个整数,如“
100
”。数值越高,优先级也就越高。默认值为 0。在某些情况下,系统会忽略请求的优先级,并将值限定为
0
。此类情况发生在:- 非特权应用请求任何大于 0 的优先级时
- 特权应用为
ACTION_VIEW
、ACTION_SEND
、ACTION_SENDTO
或ACTION_SEND_MULTIPLE
请求大于 0 的优先级时
另请参阅
setPriority()
。 android:order
- 当多个过滤器匹配时应按什么顺序处理过滤器。
order
与priority
的不同之处在于,priority
在多个应用间应用,而 可消除单个应用中多个匹配的过滤器的歧义。当多个过滤器可以匹配时,请改用定向 Intent。
值必须是一个整数,如“
100
”。数值越高,匹配顺序越靠前。默认值为0
。此属性是在 API 级别 28 中引入的。
<manifest>
- 语法:
-
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="string"
android:sharedUserId="string"
android:sharedUserLabel="string resource"
android:versionCode="integer"
android:versionName="string"
android:installLocation=["auto" | "internalOnly" | "preferExternal"] >
. . .
</manifest>
- 包含于:
- 无
- 必须包含:
<application>
- 可包含:
<compatible-screens>
<instrumentation>
<permission>
<permission-group>
<permission-tree>
<supports-gl-texture>
<supports-screens>
<uses-configuration>
<uses-feature>
<uses-permission>
<uses-permission-sdk-23>
<uses-sdk>
- 说明:
- AndroidManifest.xml 文件的根元素。它必须包含
<application>
元素并指定xmlns:android
和package
属性。 - 属性:
xmlns:android
- 定义 Android 命名空间。此属性应始终设置为“
http://schemas.android.com/apk/res/android
”。 package
- Android 应用的 Java 语言样式的完整软件包名称。此名称可以包含大写或小写字母(从“A”到“Z”)、数字和下划线(“_”)。不过,各个软件包名称部分只能以字母开头。
将应用构建为应用软件包 (APK) 时,构建系统使用
package
属性执行以下两个操作:- 它将此名称用作应用生成的
R.java
类(用于访问应用资源)的命名空间。例如,如果将
package
设置为"com.example.myapp"
,则R
类在com.example.myapp.R
处创建。 - 它使用此名称解析清单文件中声明的任何相关类名称。
例如,如果将
package
设置为"com.example.myapp"
,则声明为<activity android:name=".MainActivity">
的 Activity 会解析为com.example.myapp.MainActivity
。
此名称不仅是应用进程的默认名称(请参阅
<application>
元素的process
属性),还是您的 Activity 的默认任务相关性(请参阅<activity>
元素的taskAffinity
属性)。此名称还表示应用 ID,该 ID 必须是通用唯一 ID,您才能在 Google Play 中发布应用。不过,在 APK 构建流程快要结束时,构建工具会使用
build.gradle
文件(Android Studio 项目使用的文件)中的applicationId
属性替换package
名称。您只要确保清单的package
名称与构建文件的applicationId
保持一致,就无需担心。但如果这两个值不同,您应该阅读如何设置应用 ID,了解“软件包名称”和“应用 ID”之间的区别。为避免与其他开发者发生冲突,您应将互联网域名所有者(反过来)用作软件包名称的前缀。例如,由 Google 发布的应用以
com.google
开头。注意:Google Play 禁止使用
com.example
和com.android
命名空间。如果您想在发布应用后更改软件包名称,可以这样做,但您必须保持
applicationId
不变。applicationId
定义了应用在 Google Play 上的唯一身份。因此,如果您对其进行更改,则该 APK 就会被视为其他应用,而且使用之前版本的用户将不会收到更新。如需了解详情,请参阅如何设置应用 ID。 - 它将此名称用作应用生成的
android:sharedUserId
-
API 级别 29 中已弃用此常量。
共享用户 ID 会在软件包管理器中导致具有不确定性的行为。因此,强烈建议您不要使用它,并且我们在未来的 Android 版本中会将其移除。相反,应用应使用适当的通信机制(例如服务和内容提供程序),在共享组件之间实现互操作性。与其他应用共享的 Linux 用户 ID 的名称。默认情况下,Android 会为每个应用分配其唯一用户 ID。不过,如果针对两个或多个应用将此属性设置为相同的值,则这些应用都将共享相同的 ID,前提是这些应用的证书集完全相同。具有相同用户 ID 的应用可以访问彼此的数据,如果需要的话,还可以在同一进程中运行。
android:targetSandboxVersion
- 此应用要使用的目标沙盒。沙盒版本号越高,安全级别就越高。其默认值为
1
;您也可以将其设置为2
。将此属性设置为2
可将应用切换到其他 SELinux 沙盒。以下限制适用于 2 级沙盒:
- 网络安全配置中的
usesCleartextTraffic
的默认值为 false。 - 不允许共享 uid。
对于以 Android 8.0(API 级别 26)或更高版本为目标平台的 Android 免安装应用,此属性必须设置为 2。您可以在应用的已安装版本中将沙盒级别设置为限制比较宽松的级别 1,但如果这样做,您的应用就不会将免安装应用中的应用数据保留到应用的已安装版本。您必须将已安装应用的沙盒值设置为 2,才能将免安装应用中的数据保留到已安装版本。
应用安装后,您只能将其目标沙盒值更新为更高的值。要对目标沙盒值进行降级,您必须卸载该应用,并将其替换为其清单包含此属性的更低值的版本。
- 网络安全配置中的
android:sharedUserLabel
-
API 级别 29 中已弃用此常量。
共享用户 ID 会在软件包管理器中导致具有不确定性的行为。因此,强烈建议您不要使用它,并且我们在未来的 Android 版本中会将其移除。相反,应用应使用适当的通信机制(例如服务和内容提供程序),在共享组件之间实现互操作性。共享用户 ID 的用户可读标签。此标签必须设置为对字符串资源的引用;它不能是原始字符串。
此属性在 API 级别 3 中引入。仅当同时设置了
sharedUserId
属性时,此属性才有意义。 android:versionCode
- 内部版本号。此数字仅用于确定某个版本是否比另一个版本更新:数字越大,则版本越新。这不是向用户显示的版本号;此数字由
versionName
属性设置。该值必须设置为整数,例如“100”。您可以根据需要定义该值,只要每个连续版本的数字都比较大。例如,它可以是版本号。或者,您可以通过分别以较低和较高的 16 位对“x”和“y”进行编码,将“x.y”格式的版本号转换为整数。或者,您只需在每次发布新版本时将该数字增加 1 即可。
android:versionName
- 向用户显示的版本号。此属性可设置为原始字符串或对字符串资源的引用。除了向用户显示之外,该字符串没有其他用途。
versionCode
属性包含在内部使用的重要版本号。 android:installLocation
- 应用的默认安装位置。
接受以下关键字字符串:
值 说明 “ internalOnly
”应用必须仅安装在内部设备存储空间中。如果设置此值,则应用一定不会安装在外部存储空间中。如果内部存储空间已满,则系统将不会安装应用。如果您没有定义 android:installLocation
,则这也是默认行为。“ auto
”应用可以安装在外部存储空间中,但默认情况下,系统会将应用安装在内部存储空间中。如果内部存储空间已满,系统会将应用安装在外部存储空间中。安装后,用户可以通过系统设置将应用移至内部或外部存储空间。 “ preferExternal
”应用更倾向于安装在外部存储空间(SD 卡)中。无法保证系统会遵循该请求。如果外部媒体不可用或已满,则应用可能会安装在内部存储空间中。安装后,用户可以通过系统设置将应用移至内部或外部存储空间。 注意:默认情况下,您的应用将安装在内部存储空间中,除非您将此属性定义为“
auto
”或“preferExternal
”,否则应用不会安装在外部存储空间中。应用安装在外部存储空间中时:
.apk
文件保存到外部存储空间,但所有应用数据(如数据库)仍保存在内部设备内存中。- 用于保存
.apk
文件的容器使用密钥进行加密,该密钥可让应用仅在安装它的设备上运行。(用户无法将 SD 卡转移到其他设备并使用该卡上安装的应用。)不过,同一设备可以使用多个 SD 卡。 - 根据用户的请求,应用可以移至内部存储空间。
用户还可以请求将应用从内部存储空间移至外部存储空间。不过,如果此属性设置为
internalOnly
(默认设置),系统将不允许用户将应用移至外部存储空间。如需详细了解如何使用此属性(包括如何保持向后兼容性),请阅读应用安装位置。
<meta-data>
- 语法:
-
<meta-data android:name="string"
android:resource="resource specification"
android:value="string" /> - 包含于:
<activity>
<activity-alias>
<application>
<provider>
<receiver>
<service>
- 说明:
- 可以向父组件提供的其他任意数据项的名称值对。一个组件元素可以包含任意数量的
<meta-data>
子元素。所有这些子元素的值收集到一个Bundle
对象,并且可作为PackageItemInfo.metaData
字段提供给组件。普通值通过
value
属性指定。不过,要将资源 ID 指定为值,请改为使用resource
属性。例如,以下代码会将@string/kangaroo
资源中存储的任何值分配给“zoo
”名称:<meta-data android:name="zoo" android:value="@string/kangaroo" />
另一方面,使用
resource
属性会为资源的数字 ID 分配“zoo
”,而不是资源中存储的值:<meta-data android:name="zoo" android:resource="@string/kangaroo" />
强烈建议不要提供相关数据作为多个单独的
<meta-data>
条目。相反,如果您有要与组件相关联的复杂数据,请将其存储为资源,并使用resource
属性告知组件其 ID。 - 属性:
android:name
- 该项的唯一名称。要确保此名称具有唯一性,请使用 Java 样式的命名惯例,例如“
com.example.project.activity.fred
”。 android:resource
- 对资源的引用。资源的 ID 是分配给该项的值。可以通过
Bundle.getInt()
方法从元数据 Bundle 中检索 ID。 android:value
- 分配给该项的值。下表列出了可以指定为值的数据类型以及组件用于检索这些值的 Bundle 方法:
类型 Bundle 方法 字符串值,使用双反斜线 ( \\
) 转义字符,例如“\\n
”和“\\uxxxxx
”表示 Unicode 字符。getString()
整数值,例如“ 100
”getInt()
布尔值,“ true
”或“false
”getBoolean()
颜色值,格式为“ #rgb
”、“#argb
”、“#rrggbb
”或“#aarrggbb
”getInt()
浮点值,例如“ 1.23
”getFloat()