Android复习(三)清单文件中的元素——>action、activity-alias、category、compatible-screens、data
<action>
- 语法:
-
<action android:name="string" />
- 包含于:
<intent-filter>
- 说明:
- 向 Intent 过滤器添加操作。
<intent-filter>
元素必须包含一个或多个<action>
元素。如果 Intent 过滤器中没有<action>
元素,则过滤器不接受任何Intent
对象。如需详细了解 Intent 过滤器和操作规范在过滤器中的作用,请参阅 Intent 和 Intent 过滤器。 - 属性:
android:name
- 操作的名称。某些标准操作在
Intent
类中定义为ACTION_string
常量。要将其中一项操作分配给此属性,请在ACTION_
后跟的string
前面加上“android.intent.action.
”。例如,对于ACTION_MAIN
,请使用“android.intent.action.MAIN
”;对于ACTION_WEB_SEARCH
,请使用“android.intent.action.WEB_SEARCH
”。对于您定义的操作,最好将应用的软件包名称用作前缀,以确保唯一性。例如,可按如下方式指定
TRANSMOGRIFY
操作:
<activity-alias>
- 语法:
-
<activity-alias android:enabled=["true" | "false"] android:exported=["true" | "false"] android:icon="drawable resource" android:label="string resource" android:name="string" android:permission="string" android:targetActivity="string" > . . . </activity-alias>
- 包含于:
<application>
- 可包含:
<intent-filter>
<meta-data>
- 说明:
- Activity 的别名,由
targetActivity
属性命名。目标必须与别名在同一应用中,并且在清单中必须在别名之前进行声明。别名将目标 Activity 呈现为独立实体。它可以具有自己的一组 Intent 过滤器,这些 Intent 过滤器(而不是目标 Activity 本身的 Intent 过滤器)决定了哪些 Intent 可以通过别名激活目标,以及系统如何处理别名。例如,别名的 Intent 过滤器可以指定“
android.intent.action.MAIN
”和“
android.intent.category.LAUNCHER
”标志,以使其呈现在应用启动器中,即使目标 Activity 本身的任何过滤器都未设置这些标志。
除了
targetActivity
之外,<activity-alias>
属性是<activity>
属性的子集。对于子集中的属性,为目标设置的任何值都不会沿用于别名。不过,对于不在子集中的属性,为目标 Activity 设置的值也会应用于别名。 - 属性:
android:enabled
- 系统是否可以通过此别名实例化目标 Activity。如果可以,则设为“
true
”;如果不能,则设为“false
”。默认值为“true
”。<application>
元素具有自己的enabled
属性,该属性适用于所有应用组件,包括 Activity 别名。<application>
和<activity-alias>
属性必须都设为“true
”,系统才能通过别名实例化目标 Activity。如果其中任一属性设为“false
”,则别名不起作用。 android:exported
- 其他应用的组件是否可以通过此别名启动目标 Activity。如果可以,则设为“
true
”;如果不能,则设为“false
”。如果设为“false
”,则只有与别名在同一应用中的组件或具有同一用户 ID 的应用的组件可以通过别名启动目标 Activity。默认值取决于别名是否包含 Intent 过滤器。没有任何过滤器表示只有指定别名的确切名称才能通过别名调用 Activity。这意味着别名仅供应用内部使用(因为其他应用不知道其名称),所以默认值为“
false
”。另一方面,至少存在一个过滤器意味着别名供外部使用,所以默认值为“true
”。 android:icon
- 通过别名呈现给用户时目标 Activity 的图标。如需了解详情,请参阅
<activity>
元素的icon
属性。 android:label
- 通过别名呈现给用户时别名的用户可读标签。如需了解详情,请参阅
<activity>
元素的label
属性。 android:name
- 别名的唯一名称。该名称应类似于完全限定类名。但是,与目标 Activity 的名称不同,别名名称是任意的,它不引用实际类。
android:permission
- 客户端要通过别名启动目标 Activity 或让其执行某项操作而必须具备的权限的名称。如果没有向
startActivity()
或
startActivityForResult()
的调用方授予指定的权限,将无法激活目标 Activity。
此属性会取代为目标 Activity 本身设置的任何权限。如果未设置此属性,则无需权限即可通过别名激活目标。
如需详细了解权限,请参阅简介中的权限部分。
android:targetActivity
- 可通过别名激活的 Activity 的名称。此名称必须与清单中别名前面的
<activity>
元素的name
属性匹配。
<category>
- 语法:
-
<category android:name="string" />
- 包含于:
<intent-filter>
- 说明:
- 向 Intent 过滤器添加类别名称。如需详细了解 Intent 过滤器和类别规范在过滤器中的作用,请参阅 Intent 和 Intent 过滤器。
- 属性:
android:name
- 类别的名称。标准类别在
Intent
类中定义为CATEGORY_name
常量。此处分配的名称可以根据这些常量推导出来,方法是在CATEGORY_
后跟的name
前面加上“android.intent.category.
”作为前缀。例如,CATEGORY_LAUNCHER
的字符串值为“android.intent.category.LAUNCHER
”。注意:为了接收隐式 Intent,您必须在 Intent 过滤器中添加
CATEGORY_DEFAULT
类别。startActivity()
和startActivityForResult()
方法将所有 Intent 当作声明了CATEGORY_DEFAULT
类别一样对待。如果您没有在 Intent 过滤器中声明该类别,则任何隐式 Intent 都不会解析为您的 Activity。自定义类别应将软件包名称用作前缀,以确保它们的唯一性。
<compatible-screens>
- 语法:
-
<compatible-screens> <screen android:screenSize=["small" | "normal" | "large" | "xlarge"] android:screenDensity=["ldpi" | "mdpi" | "hdpi" | "xhdpi" | "280" | "360" | "420" | "480" | "560" ] /> ... </compatible-screens>
- 包含于:
<manifest>
- 说明:
- 指定应用与之兼容的各个屏幕配置。清单中只能包含
<compatible-screens>
元素的一个实例,但可以包含多个<screen>
元素。每个<screen>
元素都指定了应用与之兼容的特定屏幕尺寸-密度组合。Android 系统不会读取
<compatible-screens>
清单元素(无论是在安装时还是在运行时)。此元素仅用于提供信息,可供外部服务(如 Google Play)用于更好地了解应用与特定屏幕配置的兼容性,并为用户启用过滤功能。未在此元素中声明的任何屏幕配置都是应用与之不兼容的屏幕。因此,外部服务(如 Google Play)不会向使用此类屏幕的设备提供应用。注意:正常情况下,不应使用此清单文件元素。使用此元素可能会显著减少应用的潜在用户群,因为如果您未列出用户所用设备的屏幕配置,则它不允许用户安装您的应用。只有在万不得已时,也就是应用绝对无法与特定屏幕配置一起使用时,才能使用此元素。您不应使用此元素,而应按照支持多种屏幕指南,为针对不同屏幕尺寸和密度使用备用布局的多种屏幕提供可扩展支持。
如果您只想为应用设置最小屏幕尺寸,则应使用
<supports-screens>
元素。例如,如果您希望应用仅适用于大屏幕和特大屏幕设备,则可以通过<supports-screens>
元素声明您的应用不支持小屏幕和标准屏幕尺寸。外部服务(如 Google Play)会相应地过滤您的应用。您还可以使用<supports-screens>
元素声明系统是否应根据不同的屏幕尺寸调整应用的大小。如需详细了解 Google Play 如何使用此清单元素和其他清单元素过滤应用,另请参阅 Google Play 上的过滤器文档。
- 子元素:
- 示例
-
如果您的应用仅与小屏幕和标准屏幕兼容(无论屏幕密度如何),则必须指定十二种不同的
<screen>
元素,因为每种屏幕尺寸都有六个不同的密度配置。您必须声明这些元素之一;您未指定的任何尺寸和密度组合都会被视为您的应用与之不兼容的屏幕配置。如果您的应用仅与小屏幕和标准屏幕兼容,则清单条目如下所示:<manifest ... > ... <compatible-screens> <!-- all small size screens --> <screen android:screenSize="small" android:screenDensity="ldpi" /> <screen android:screenSize="small" android:screenDensity="mdpi" /> <screen android:screenSize="small" android:screenDensity="hdpi" /> <screen android:screenSize="small" android:screenDensity="xhdpi" /> <screen android:screenSize="small" android:screenDensity="xxhdpi" /> <screen android:screenSize="small" android:screenDensity="xxxhdpi" /> <!-- all normal size screens --> <screen android:screenSize="normal" android:screenDensity="ldpi" /> <screen android:screenSize="normal" android:screenDensity="mdpi" /> <screen android:screenSize="normal" android:screenDensity="hdpi" /> <screen android:screenSize="normal" android:screenDensity="xhdpi" /> <screen android:screenSize="normal" android:screenDensity="xxhdpi" /> <screen android:screenSize="normal" android:screenDensity="xxxhdpi" /> </compatible-screens> <application ... > ... <application> </manifest>
<data>
- 语法:
-
<data android:scheme="string" android:host="string" android:port="string" android:path="string" android:pathPattern="string" android:pathPrefix="string" android:mimeType="string" />
- 包含于:
<intent-filter>
- 说明:
- 向 Intent 过滤器添加数据规范。该规范可以是只有数据类型(
mimeType
属性),可以是只有 URI,也可以是既有数据类型又有 URI。URI 由其各个部分的单独属性指定:<scheme>://<host>:<port>[<path>|<pathPrefix>|<pathPattern>]
用于指定网址格式的以下属性是可选的,但也相互依赖:
同一
<intent-filter>
元素中包含的所有<data>
元素都对同一过滤器起作用。例如,以下过滤器规范:<intent-filter . . . > <data android:scheme="something" android:host="project.example.com" /> . . . </intent-filter>
等同于以下规范:
<intent-filter . . . > <data android:scheme="something" /> <data android:host="project.example.com" /> . . . </intent-filter>
您可以在
<intent-filter>
内放置任意数量的<data>
元素,为其提供多个数据选项。它的属性都没有默认值。如需了解 Intent 过滤器如何工作,包括如何根据过滤器来匹配 Intent 对象的规则,请参阅另一篇文档 - Intent 和 Intent 过滤器。另请参阅清单文件概览中的 Intent 过滤器部分。
- 属性:
android:scheme
- URI 的架构部分。这是指定 URI 时最基本的属性;必须至少为过滤器设置一个
scheme
属性,否则其他 URI 属性都没有意义。指定的架构应不带尾随冒号(例如,应指定
http
,而不是http:
)。如果为过滤器设置了数据类型(
mimeType
属性),但未设置架构,则采用content:
和file:
架构。注意:Android 框架中的架构匹配区分大小写,这一点与 RFC 不同。因此,您应始终使用小写字母指定架构。
android:host
- URI 授权方的主机部分。除非也为过滤器指定了
scheme
属性,否则此属性没有意义。要匹配多个子网域,请使用星号 (*
) 匹配主机中的零个或多个字符。例如,主机*.google.com
匹配www.google.com
、.google.com
和developer.google.com
。星号必须是主机属性的第一个字符。例如,主机
google.co.*
无效,因为星号通配符不是第一个字符。注意:Android 框架中的主机名匹配区分大小写,这一点与正式的 RFC 不同。因此,您应始终使用小写字母指定主机名。
android:port
- URI 授权方的端口部分。仅当同时为过滤器指定了
scheme
和host
属性时,此属性才有意义。 android:path
android:pathPrefix
android:pathPattern
- URI 的路径部分,必须以 / 开头。
path
属性指定与 Intent 对象中的完整路径匹配的完整路径。pathPrefix
属性指定只与 Intent 对象中的路径的初始部分匹配的部分路径。pathPattern
属性指定与 Intent 对象中的完整路径匹配的完整路径,但它可以包含以下通配符:- 星号(“
*
”)匹配出现零次到多次的紧邻前面的字符的一个序列。 - 句点后跟星号(“
.*
”)匹配零个到多个字符的任意序列。
由于在从 XML 读取字符串时(在将其解析为模式之前)将“
\
”用作转义字符,因此您需要进行双重转义。例如,字面量“*
”将编写为“\\*
”,字面量“”将编写为“\\\\
”。这基本上与采用 Java 代码构造字符串时需要编写的内容一样。如需详细了解这三种类型的模式,请参阅
PatternMatcher
类中的PATTERN_LITERAL
、PATTERN_PREFIX
和PATTERN_SIMPLE_GLOB
的说明。 - 星号(“
android:mimeType
- MIME 媒体类型,如
image/jpeg
或audio/mpeg4-generic
。子类型可以是星号通配符 (*
),以指示任何子类型都匹配。Intent 过滤器经常会声明仅包含
android:mimeType
属性的<data>
。注意:Android 框架中的 MIME 类型匹配区分大小写,这一点与正式的 RFC MIME 类型不同。因此,您应始终使用小写字母指定 MIME 类型。