Android AndroidManifest 文件内标签及属性
以下是重新排版后的文章:
AndroidManifest
1. <manifest>
-
它是
AndroidManifest.xml
文件的根标签,包含了整个应用程序的基本信息,如应用程序的包名、版本代码、版本名称等。所有其他标签几乎都是在manifest
标签内部定义的。 -
示例:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapplication"
android:sharedUserId="com.example.shareduser"
android:versionCode="1"
android:versionName="1.0"
android:installLocation="preferExternal">
<!-- 这里可以继续添加<application>、<uses - permission>等子标签 -->
</manifest>
属性
-
xmlns:android
- 含义:定义 Android 命名空间,用于在清单文件中引用 Android 系统提供的各种属性和标签。
- 示例:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.myapplication">
- 这个命名空间使得在后续的标签和属性设置中能够使用
android:
前缀来引用 Android 系统定义的标准属性,如android:icon
、android:label
等。
-
package
- 含义:指定应用程序的包名。这个包名在整个 Android 系统中是唯一的,用于识别应用。它是应用的一个重要标识符,在很多场景下都会用到,比如组件的引用、权限的定义等。
- 示例:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.myapplication">
- 包名通常采用反向域名的格式,如
com.example.myapplication
,其中com.example
是开发者或组织的域名倒写,myapplication
是应用的具体名称部分。
-
android:sharedUserId
- 含义:用于多个应用之间共享用户 ID。当多个应用设置了相同的
sharedUserId
时,它们可以访问彼此的数据,并且在一定程度上可以共享进程等资源。不过,这种共享也需要谨慎使用,因为可能会带来安全风险。 - 示例:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.myapplication" android:sharedUserId="com.example.shareduser">
- 在这个例子中,设置了共享用户 ID 为
com.example.shareduser
,如果其他应用也设置了相同的sharedUserId
,就可以在符合权限规则的情况下共享资源。
- 含义:用于多个应用之间共享用户 ID。当多个应用设置了相同的
-
android:versionCode
- 含义:用于表示应用程序的版本号,是一个整数值。这个版本号主要用于系统和应用市场来区分应用的不同版本,用于升级等操作。例如,当新版本的
versionCode
大于旧版本时,系统可以提示用户进行升级。 - 示例:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.myapplication" android:versionCode="1">
- 开发者在更新应用时,需要逐步递增这个版本号,一般来说,每次发布一个新的版本,版本号都应该比之前的版本大。
- 含义:用于表示应用程序的版本号,是一个整数值。这个版本号主要用于系统和应用市场来区分应用的不同版本,用于升级等操作。例如,当新版本的
-
android:versionName
- 含义:这是一个用于显示给用户的版本名称,通常是一个字符串,如
1.0
、1.1 - beta
等格式。它主要用于用户在应用市场或者应用的关于页面中查看应用的版本信息。 - 示例:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.myapplication" android:versionName="1.0">
- 与
versionCode
不同,versionName
更侧重于用户友好的版本展示,它可以包含一些额外的信息,如版本的阶段(alpha、beta、release 等)。
- 含义:这是一个用于显示给用户的版本名称,通常是一个字符串,如
-
android:installLocation
- 含义:用于指定应用的安装位置。它可以有三个值:
internalOnly
(仅安装在内部存储)、preferExternal
(优先安装在外部存储,如果外部存储不可用则安装在内部存储)和auto
(由系统根据存储情况决定安装位置)。 - 示例:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.myapplication" android:installLocation="preferExternal">
- 这个设置可以帮助用户更好地管理设备的存储空间,特别是对于一些大型应用或者存储资源有限的设备。
- 含义:用于指定应用的安装位置。它可以有三个值:
1.2. <uses - permission>
- 用于声明应用需要的权限。这些权限允许应用访问受保护的系统资源或执行特定的操作。例如,访问网络、读取联系人等。
- 示例:
<uses - permission android:name="android.permission.INTERNET"/>
- 这个标签表示应用需要访问网络的权限。
1.3. <permission>
- 用于定义应用自己的权限。如果应用希望提供数据或者服务给其他应用,并且想要控制对这些内容的访问,就可以使用这个标签来定义权限。
- 示例:
<permission
android:name="com.example.myapplication.permission.MY_PERMISSION"
android:description="@string/permission_description"
android:label="@string/permission_label"
android:protectionLevel="normal"/>
1.4. <instrumentation>
- 主要用于测试。它可以用来监视应用的运行情况,例如在测试自动化框架中使用,通过它可以在应用运行时收集各种数据。
- 示例:
<instrumentation
android:name="android.test.InstrumentationTestRunner"
android:targetPackage="com.example.myapplication"/>
1.5. <uses - sdk>
- 用于指定应用所兼容的 Android SDK 版本信息,包括最小 SDK 版本、目标 SDK 版本和最大 SDK 版本。这有助于确保应用在合适的 Android 设备上运行,并且可以利用特定版本的 API。
- Android studio3.0 以后 sdk 最小版本设置不能在 manifest.xml 设置,必须在 gradle 里设置功能。
- 示例:
<uses - sdk
android:minSdkVersion="21"
android:targetSdkVersion="30"/>
1.6. <uses - feature>
- 用于声明应用所使用的设备硬件或软件功能。例如,如果应用需要使用相机功能,就可以使用这个标签来声明。这样可以帮助应用市场等平台更好地筛选设备,确保应用在具有所需功能的设备上安装。
- 示例:
<uses - feature android:name="android.hardware.camera"/>
1.7. <supports - screens>
- 用于指定应用支持的屏幕尺寸和密度。这有助于确保应用在不同屏幕的设备上(如手机、平板等)都能有较好的显示效果。
- 示例:
<supports - screens
android:smallScreens="true"
android:normalScreens="true"
android:largeScreens="true"/>
1.8. <compatible - screens>
- 这个标签与
supports - screens
类似,但它是更严格的屏幕兼容性定义。它可以指定应用只兼容某些特定的屏幕尺寸和密度组合。 - 示例:
<compatible - screens>
<screen
android:screenSize="small"
android:screenDensity="mdpi"/>
</compatible - screens>
1.9. <application>
- 如前面所述,它用于描述应用程序本身的各种属性和组件,包括 Activity、Service、Broadcast Receiver 和 Content Provider 等。这是定义应用功能的核心标签之一。
- 示例:
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name">
<!-- 定义 Activity、Service 等组件 -->
</application>
属性
-
android:icon
- 含义:用于指定应用程序的图标。
-
android:label
- 含义:用于设置应用程序的名称。这个名称会在应用图标旁边显示(如在主屏幕或应用抽屉中),也可能在系统的应用管理界面等地方出现。一般引用
string
资源,如@string/app_name
。 app_name
对应的字符串会作为应用的名称展示给用户。
- 含义:用于设置应用程序的名称。这个名称会在应用图标旁边显示(如在主屏幕或应用抽屉中),也可能在系统的应用管理界面等地方出现。一般引用
-
android:allowBackup
-
含义:AllowBackup 是在 Android 2.2 中引入的一个系统备份的功能。允许用户备份系统应用和第三方应用的 apk 安装包和应用数据,以便在刷机或者数据丢失后恢复应用,用户即可通过 adb backup 和 adb restore 来进行对应用数据的备份和恢复。第三方应用开发者需要在应用的 AndroidManifest.xml 文件中配置 allowBackup 标志(默认为 true )来设置应用数据是否能能够被备份或恢复。
-
allowBackup 会引起的高危漏洞是什么?
-
Android 属性 allowBackup 安全风险源于 adb backup 容许任何一个能够打开 USB 调试开关的人从 Android 手机中复制应用数据到外设,一旦应用数据被备份之后,所有应用数据都可被用户读取;adb restore 容许用户指定一个恢复的数据来源(即备份的应用数据)来恢复应用程序数据的创建。因此,当一个应用数据被备份之后,用户即可在其他 Android 手机或模拟器上安装同一个应用,以及通过恢复该备份的应用数据到该设备上,在该设备上打开该应用即可恢复到被备份的应用程序的状态。
-
尤其是通讯录应用,一旦应用程序支持备份和恢复功能,攻击者即可通过 adb backup 和 adb restore 进行恢复新安装的同一个应用来查看聊天记录等信息;对于支付金融类应用,攻击者可通过此来进行恶意支付、盗取存款等;因此为了安全起见,开发者务必将 allowBackup 标志值设置为 false 来关闭应用程序的备份和恢复功能,以免造成信息泄露和财产损失。
-
当
android:allowBackup
设置为false
时,系统不会备份该应用的数据。
-
-
android:backupAgent
- 含义:用于指定备份代理类。如果
android:allowBackup
为true
,并且需要自定义备份行为,可以通过这个属性指定一个实现了android.app.backup.BackupAgent
接口的类来处理备份和恢复操作。 - 示例:
<application android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:allowBackup="true" android:backupAgent="com.example.myapp.MyBackupAgent"> <!-- 应用组件定义 --> </application>
- 这里
MyBackupAgent
是自定义的备份代理类,用于处理应用数据的备份和恢复细节。
- 含义:用于指定备份代理类。如果
-
android:debuggable
- 含义:一个布尔值属性,用于指定应用是否可以被调试。在开发阶段,通常设置为
true
,这样开发工具(如 Android Studio)可以连接到应用进行调试。在发布版本中,应该设置为false
以提高应用的安全性。 - 示例:
<application android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:debuggable="true"> <!-- 应用组件定义 --> </application>
- 当
android:debuggable
为true
时,应用可以被调试工具连接并进行调试操作。
- 含义:一个布尔值属性,用于指定应用是否可以被调试。在开发阶段,通常设置为
-
android:description
- 含义:用于提供应用的详细描述。这个描述可能会在应用市场等地方显示,帮助用户了解应用的功能和用途。通常引用
string
资源,如@string/app_description
。 - 示例:
<application android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:description="@string/app_description"> <!-- 应用组件定义 --> </application>
app_description
对应的字符串内容会作为应用的详细描述展示给用户。
- 含义:用于提供应用的详细描述。这个描述可能会在应用市场等地方显示,帮助用户了解应用的功能和用途。通常引用
-
android:enabled
- 含义:一个布尔值属性,用于指定应用是否启用。如果设置为
false
,应用将无法正常启动,所有组件也不会响应。默认值为true
。 - 示例:
<application android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:enabled="false"> <!-- 应用组件定义 --> </application>
- 当
android:enabled
为false
时,应用处于禁用状态。
- 含义:一个布尔值属性,用于指定应用是否启用。如果设置为
-
android:hardwareAccelerated
- 含义:一个布尔值属性,用于指定应用是否启用硬件加速。硬件加速可以利用设备的 GPU 来加速图形渲染等操作,提高应用的性能,特别是对于有大量图形处理的应用。默认值因 Android 版本而异。
- 示例:
<application android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:hardwareAccelerated="true"> <!-- 应用组件定义 --> </application>
- 当
android:hardwareAccelerated
为true
时,应用会尝试使用硬件加速来提升性能。
-
android:largeHeap
- 含义:一个布尔值属性,用于指定应用是否可以使用较大的堆内存。默认情况下,Android 为应用分配一定大小的内存堆,当设置
android:largeHeap
为true
时,允许应用使用更多的内存,但这可能会影响设备的整体性能和稳定性,并且需要谨慎使用。 - 示例:
<application android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:largeHeap="true"> <!-- 应用组件定义 --> </application>
- 当
android:largeHeap
为true
时,应用有机会使用比正常情况下更多的内存。
- 含义:一个布尔值属性,用于指定应用是否可以使用较大的堆内存。默认情况下,Android 为应用分配一定大小的内存堆,当设置
-
android:permission
- 含义:用于指定访问这个应用组件的权限。如果其他应用想要访问这个应用的组件(如 Activity、Service 等),需要拥有这个指定的权限。
- 示例:
<application android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:permission="com.example.myapp.PERMISSION_TO_ACCESS"> <!-- 应用组件定义 --> </application>
- 其他应用要访问这个应用的组件,就需要声明
com.example.myapp.PERMISSION_TO_ACCESS
这个权限。
-
android:process
- 含义:用于指定应用组件运行的进程。默认情况下,所有组件都在应用的默认进程中运行,但可以通过这个属性为不同的组件指定不同的进程,甚至可以让多个应用共享一个进程。
- 示例:
<application android:icon="@drawable/ic_launcher" android:label="@string/app_name"> <activity android:name=".MyActivity" android:process=":my_process"> <!-- 其他内容 --> </activity> </application>
- 这里
MyActivity
会在名为:my_process
的进程中运行,而不是在应用的默认进程中。
-
android:restoreAnyVersion
- 含义:一个布尔值属性,用于指定在恢复应用数据时是否允许恢复任何版本的数据。如果设置为
true
,系统会尝试使用备份代理恢复数据,即使备份的数据是来自应用的旧版本。默认值为false
。 - 示例:
<application android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:restoreAnyVersion="true"> <!-- 应用组件定义 --> </application>
- 当
android:restoreAnyVersion
为true
时,系统在恢复数据时会更灵活地处理不同版本的数据备份。
- 含义:一个布尔值属性,用于指定在恢复应用数据时是否允许恢复任何版本的数据。如果设置为
-
android:taskAffinity
- 含义:用于指定 Activity 所属的任务相关性。它主要用于确定 Activity 在任务栈中的归属,以及与其他任务栈的关系。默认情况下,一个应用的所有 Activity 都具有相同的任务相关性,与应用的包名相关。
- 示例:
<application android:icon="@drawable/ic_launcher" android:label="@string/app_name"> <activity android:name=".MyActivity" android:taskAffinity="com.example.myapp.my_task"> <!-- 其他内容 --> </activity> </application>
- 这里
MyActivity
的任务相关性被设置为com.example.myapp.my_task
,这可能会影响它在任务栈中的行为,比如在启动新的 Activity 或者处理返回键操作时。
-
android:usesCleartextTraffic
- 含义:一个布尔值属性,用于指定应用是否允许使用明文网络流量。在一些安全要求较高的环境中,可能需要限制应用只能使用加密的网络连接(如HTTPS),此时可以将这个属性设置为
false
。默认值为true
。 - 示例:
<application android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:usesCleartextTraffic="false"> <!-- 应用组件定义 --> </application>
- 当
android:usesCleartextTraffic
为false
时,应用在网络通信中会受到限制,不能使用明文协议(如HTTP)。
- 含义:一个布尔值属性,用于指定应用是否允许使用明文网络流量。在一些安全要求较高的环境中,可能需要限制应用只能使用加密的网络连接(如HTTPS),此时可以将这个属性设置为
-
tools:replace
tools:replace
是一个 Android Gradle 插件中用于处理合并清单文件时的属性。
- 含义:当在 Android 项目中使用多个清单文件(例如库项目和主项目都有自己的
AndroidManifest.xml
),在合并这些清单文件的过程中可能会出现冲突。tools:replace
属性允许开发者指定哪些元素或属性应该在合并时被替换,而不是产生合并错误。
如果AAR或者moudle内给Application设置过属性,如果主工程也需要设置,那么主工程需要覆盖这些属性
tools:replace="android:name,android:allowBackup,android:label,android:supportsRtl"
否则异常:
> Task :app:processDebugManifest
>
D:\project_xxx\code\DfskAarTestDemo\app\src\main\AndroidManifest.xml:6:5-37:19
Warning:application@android:name was tagged at AndroidManifest.xml:6
to replace other declarations but no other declaration present
D:\project_xxx\code\DfskAarTestDemo\app\src\main\AndroidManifest.xml:
6:5-37:19 Warning:application@android:allowBackup was tagged at
AndroidManifest.xml:6 to replace other declarations but no other declaration present
android:configChanges
configChanges
是 AndroidManifest.xml 文件中的一个属性,可以指定哪些配置变化不会导致重新创建 Activity。当你的应用需要在某些配置变化发生时保持用户状态或不希望发生界面重建时,可以通过这个属性来动态处理。
android:configChanges="orientation|keyboardHidden|navigation|screenSize|locale|layoutDirection|uiMode|fontScale|mcc|mnc|screenLayout|smallestScreenSize|touchscreen|keyboard"
android:requestLegacyExternalStorage
在 Android 10 中,系统对应用程序的文件访问权限进行了一些更改。默认情况下,应用程序无法访问外部存储(如SD卡)中的文件。然而,为了向后兼容性,Android 10 提供了一个属性requestLegacyExternalStorage
,可以让应用程序继续使用旧的存储访问行为。
1.9.1. <activity>
- 含义:Activity是 Android 应用中最基本的组件之一,用于实现用户界面。每个 Activity 通常对应一个屏幕的内容。
- 示例:
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name">
<activity android:name=".MainActivity">
<intent - filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent - filter>
</activity>
</application>
- 在这个例子中,
MainActivity
是应用的主启动 Activity。intent - filter
中的action
和category
标签组合指定了该 Activity 是应用的主入口,当用户点击应用图标时会启动这个 Activity。
属性
-
android:name
- 含义:指定 Activity 的类名。这是最重要的属性之一,用于在清单文件中明确标识 Activity。可以使用完整的包名和类名(如
com.example.myapp.MyActivity
),也可以使用相对路径(如.MyActivity
,它会基于清单文件中的package
属性来确定完整的类名)。 - 示例:
<activity android:name=".MainActivity"> <intent - filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent - filter> </activity>
- 在这里,
android:name=".MainActivity"
表示该 Activity 对应的类是在当前应用包名基础上的MainActivity
类。
- 含义:指定 Activity 的类名。这是最重要的属性之一,用于在清单文件中明确标识 Activity。可以使用完整的包名和类名(如
-
android:label
- 含义:用于设置 Activity 的标题或标签。这个标题通常会显示在屏幕的顶部(如在 ActionBar 或 Toolbar 中),或者在任务管理器等地方作为 Activity 的标识。可以引用字符串资源(如
@string/activity_label
),也可以直接使用字符串。 - 示例:
<activity android:name=".MyActivity" android:label="@string/activity_title"> <!-- 其他内容 --> </activity>
- 当应用运行时,
MyActivity
的标题会显示为strings.xml
文件中activity_title
所对应的字符串内容。
- 含义:用于设置 Activity 的标题或标签。这个标题通常会显示在屏幕的顶部(如在 ActionBar 或 Toolbar 中),或者在任务管理器等地方作为 Activity 的标识。可以引用字符串资源(如
-
android:icon
- 含义:用于指定 Activity 的图标。图标可以用于在任务管理器、最近使用的应用列表等地方显示 Activity 的标识。和
android:label
一样,可以引用drawable
资源(如@drawable/activity_icon
)。 - 示例:
<activity android:name=".AnotherActivity" android:icon="@drawable/activity_icon"> <!-- 其他内容 --> </activity>
- 这个属性使得
AnotherActivity
在需要显示图标的地方(如任务切换界面)会显示drawable
文件夹下activity_icon
对应的图标。
- 含义:用于指定 Activity 的图标。图标可以用于在任务管理器、最近使用的应用列表等地方显示 Activity 的标识。和
-
android:theme
- 含义:用于设置 Activity 的主题。主题决定了 Activity 的外观风格,包括颜色、背景、字体等方面。可以引用系统自带的主题(如
@android:style/Theme.Holo.Light
),也可以使用自定义主题。 - 示例:
<activity android:name=".CustomThemeActivity" android:theme="@style/CustomTheme"> <!-- 其他内容 --> </activity>
- 这里
CustomThemeActivity
会应用名为CustomTheme
的主题,这个主题可以在styles.xml
文件中进行定义,通过修改主题的属性来改变 Activity 的整体外观。
- 含义:用于设置 Activity 的主题。主题决定了 Activity 的外观风格,包括颜色、背景、字体等方面。可以引用系统自带的主题(如
-
android:launchMode
- 含义:用于指定 Activity 的启动模式。它决定了在多个 Activity 实例之间如何交互和管理任务栈。常见的启动模式有
standard
(默认模式,每次启动都会创建一个新的实例)、singleTop
(如果目标 Activity 已经在栈顶,则复用该实例,否则创建新实例)、singleTask
(如果栈中已经存在目标 Activity,则清除它上面的所有 Activity,使目标 Activity 位于栈顶)和singleInstance
(该 Activity 会在一个单独的任务栈中运行)。 - 示例:
<activity android:name=".SingleTopActivity" android:launchMode="singleTop"> <!-- 其他内容 --> </activity>
- 当启动
SingleTopActivity
时,如果它已经在栈顶,就不会创建新的实例,而是会调用现有实例的onNewIntent()
方法来处理新的意图。
- 含义:用于指定 Activity 的启动模式。它决定了在多个 Activity 实例之间如何交互和管理任务栈。常见的启动模式有
-
android:noHistory
- 含义:一个布尔值属性。当设置为
true
时,Activity 在用户离开(如按下返回键或启动其他 Activity)后不会被保留在任务栈中,即不会在用户通过返回键返回时再次出现。 - 示例:
<activity android:name=".NoHistoryActivity" android:noHistory="true"> <!-- 其他内容 --> </activity>
- 这样
NoHistoryActivity
在用户离开后就不会出现在任务栈中,适用于一些临时的、不需要保留历史记录的界面,比如登录成功后的过渡页面。
- 含义:一个布尔值属性。当设置为
-
android:parentActivityName
- 含义:用于指定 Activity 的父 Activity。这在处理向上导航(如在 ActionBar 中点击向上箭头)时非常有用。系统可以根据这个属性自动为 Activity 添加向上导航的功能。
- 示例:
<activity android:name=".ChildActivity" android:parentActivityName=".MainActivity"> <!-- 其他内容 --> </activity>
- 当
ChildActivity
处于前台时,ActionBar 上可能会出现一个向上箭头,点击它可以导航回到MainActivity
。
-
android:screenOrientation
- 含义:用于指定 Activity 的屏幕方向。可以设置为
portrait
(竖屏)、landscape
(横屏)、sensor
(根据传感器自动旋转)等多种值。 - 示例:
<activity android:name=".FixedOrientationActivity" android:screenOrientation="portrait"> <!-- 其他内容 --> </activity>
- 这个
FixedOrientationActivity
会一直保持竖屏状态,不会随着设备的旋转而改变屏幕方向。
- 含义:用于指定 Activity 的屏幕方向。可以设置为
-
android:windowSoftInputMode
- 含义:用于指定当软键盘出现时,Activity 的窗口如何调整。例如,可以设置为
stateVisible
(软键盘总是可见)、adjustResize
(调整 Activity 的大小以适应软键盘)、adjustPan
(平移 Activity 的内容以显示被软键盘遮挡的部分)等。 - 示例:
<activity android:name=".InputActivity" android:windowSoftInputMode="adjustResize"> <!-- 其他内容 --> </activity>
- 当软键盘在
InputActivity
中出现时,Activity 会自动调整大小,使得内容能够适应软键盘出现后的屏幕空间。
- 含义:用于指定当软键盘出现时,Activity 的窗口如何调整。例如,可以设置为
1.9.1.1. <intent - filter>
- 含义:用于指定 Activity 能够响应的意图(Intent)类型。它可以包含一个或多个
<action>
、<category>
和<data>
标签的组合,以定义 Activity 可以处理的不同情况。 - 示例:
<activity android:name=".MainActivity">
<intent - filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent - filter>
</activity>
- 在这个例子中,
action
标签指定了MAIN
动作,category
标签指定了LAUNCHER
类别,这表示该 Activity 是应用的主启动 Activity,当用户点击应用图标时,系统会发送一个带有MAIN
动作和LAUNCHER
类别的意图,这个 Activity 就会被启动。
1.9.1.1.1. <action>
- 含义:用于指定一个意图动作。它定义了 Activity(或其他组件)可以响应的操作类型。例如,
android.intent.action.MAIN
表示这是主要的启动动作,android.intent.action.VIEW
通常用于查看数据等操作。 - 示例:
<intent - filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent - filter>
- 在这个示例中,
action
标签中的android.intent.action.MAIN
表明该组件是一个主要的启动点,通常与LAUNCHER
类别配合,用于启动应用。
1.9.1.1.2. <category>
- 含义:用于进一步对意图进行分类。除了动作之外,类别可以帮助系统更精准地匹配意图和组件。例如,
android.intent.category.LAUNCHER
用于标记可以在启动器中显示的组件,android.intent.category.DEFAULT
是一个默认类别,用于隐式意图。 - 示例:
<intent - filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
</intent - filter>
- 这里的 Activity 可以响应
VIEW
动作,并且同时属于DEFAULT
和BROWSABLE
类别。这可能意味着它可以从浏览器等其他应用中启动,用于查看某些内容,比如网页链接对应的自定义视图。
1.9.1.1.3. <data>
- 含义:用于指定与意图相关的数据的类型、格式和位置等信息。这可以包括数据的 MIME 类型(如
text/plain
表示纯文本)、数据的 URI(统一资源标识符)等。 - 示例:
<intent - filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="image/*"/>
</intent - filter>
- 此 Activity 可以响应
VIEW
动作,对于DEFAULT
类别,并且处理的数据类型是任意图像(image/*
),可能用于显示图片。例如,当用户尝试从文件管理器或其他应用中查看一张图片时,这个 Activity 有机会被启动来展示该图像。
1.9.1.2. <meta - data>
- 含义:为 Activity 提供额外的自定义数据。这些数据可以是各种类型,如字符串、整数等,用于配置 Activity 的特殊行为或者传递一些信息。
- 示例:
<activity android:name=".MyActivity">
<meta - data
android:name="custom_key"
android:value="custom_value"/>
</activity>
- 这里
MyActivity
有一个名为custom_key
的元数据,其值为custom_value
。在 Activity 的代码中,可以通过getMetaData()
等方法获取这些元数据来进行相应的处理,例如根据这个自定义数据来决定 Activity 的某些布局或者功能。
1.9.2. <service>
- 含义:Service用于在后台执行长时间运行的操作,不提供用户界面。例如,音乐播放服务、文件下载服务等。
- 示例:
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name">
<service android:name=".MyService"></service>
</application>
- 这里定义了一个名为
MyService
的服务,当需要在后台执行任务时,可以在代码中启动这个服务来完成相应的操作。
属性
android:name
- 含义:指定 Service 的类名。可以是完整包名和类名,也可以是相对路径(基于清单文件中的
package
属性来确定完整类名)。这是用于在清单文件中明确标识 Service 的关键属性。
- 含义:指定 Service 的类名。可以是完整包名和类名,也可以是相对路径(基于清单文件中的
- 示例:
<service android:name=".MyService"></service>
android:enabled
- 含义:布尔值属性,用于确定 Service 是否启用。设置为
false
时,Service 无法启动,默认值为true
,可用于根据条件禁用 Service。 - 示例:
- 含义:布尔值属性,用于确定 Service 是否启用。设置为
<service android:name=".MyService"
android:enabled="false"></service>
android:exported
- 含义:布尔值属性,用于指定 Service 是否可被其他应用程序组件调用。
true
表示可以被外部应用访问,false
(默认)表示只能在应用内部访问。 - 示例:
- 含义:布尔值属性,用于指定 Service 是否可被其他应用程序组件调用。
<service android:name=".InternalService"
android:exported="false"></service>
android:icon
- 含义:用于指定 Service 的图标。图标可能在某些调试或管理工具中显示以标识 Service,通常引用
drawable
资源。 - 示例:
- 含义:用于指定 Service 的图标。图标可能在某些调试或管理工具中显示以标识 Service,通常引用
<service android:name=".VisibleService"
android:icon="@drawable/service_icon"></service>
android:label
- 含义:用于设置 Service 的标签或名称,可能在调试工具、系统服务管理界面等地方显示以标识 Service,一般引用
string
资源。 - 示例:
- 含义:用于设置 Service 的标签或名称,可能在调试工具、系统服务管理界面等地方显示以标识 Service,一般引用
<service android:name=".NamedService"
android:label="@string/service_label"></service>
android:permission
- 含义:用于指定调用该 Service 所需的权限。其他组件(包括其他应用中的组件)启动或绑定此 Service 时需要拥有该权限。
- 示例:
<service android:name=".ProtectedService"
android:permission="com.example.myapp.ACCESS_SERVICE"></service>
android:process
- 含义:用于指定 Service 运行的进程。默认在应用主进程中运行,也可指定单独进程,用于隔离运行环境,提高稳定性和性能。
- 示例:
<service android:name=".IsolatedService"
android:process=":service_process"></service>
android:foregroundServiceType
- 含义:从 Android 9(API 级别 28)开始引入,用于更精细地指定前台服务的类型,如
location
、mediaPlayback
、phoneCall
等,以符合系统对不同类型前台服务的管理要求。 - 示例:
- 含义:从 Android 9(API 级别 28)开始引入,用于更精细地指定前台服务的类型,如
<service
android:name=".MyLocationService"
android:foregroundServiceType="location">
<!-- 其他服务相关内容 -->
</service>
android:stopWithTask
- 含义:布尔值属性,用于指定当与服务关联的任务结束时,服务是否随之停止。默认值为
true
,设置为false
时,服务将在任务结束后继续运行。 - 示例:
- 含义:布尔值属性,用于指定当与服务关联的任务结束时,服务是否随之停止。默认值为
<service
android:name=".MyPersistentForegroundService"
android:stopWithTask="false">
<!-- 其他服务相关内容 -->
</service>
1.9.2.1. <intent - filter>
- 含义:和 Activity 中的
intent - filter
类似,用于指定 Service 能够响应的意图类型。通过定义动作(<action>
)、类别(<category>
)和数据(<data>
)等信息,让其他组件(如 Activity)可以通过特定的意图来启动或绑定该 Service。 - 示例:
<service android:name=".MyService">
<intent - filter>
<action android:name="com.example.myapp.START_MY_SERVICE"/>
</intent - filter>
</service>
- 在这里,定义了一个动作
com.example.myapp.START_MY_SERVICE
,其他组件可以通过发送带有这个动作的意图来启动MyService
。
1.9.2.1.1. <action>
- 含义:用于指定服务可以响应的动作。这是
intent - filter
中最重要的标签之一,通过定义动作,外部组件可以发送特定动作的意图来启动或与服务交互。例如,一个音乐播放服务可能定义android.media.action.PLAY
这样的动作。 - 示例:
<service android:name=".MusicService">
<intent - filter>
<action android:name="android.media.action.PLAY"/>
</intent - filter>
</service>
- 在这里,
MusicService
可以响应PLAY
动作,当其他组件(如音乐播放控制器 Activity)发送带有android.media.action.PLAY
动作的意图时,这个服务就可以执行播放音乐的操作。
1.9.2.1.2. <category>
- 含义:用于进一步对意图进行分类,以更精确地匹配意图和服务。虽然在服务的
intent - filter
中不像在 Activity 中那么常用,但在某些情况下可以用于提供额外的筛选条件。例如,android.intent.category.DEFAULT
类别可以用于隐式意图。 - 示例:
<service android:name=".DownloadService">
<intent - filter>
<action android:name="com.example.download.START_DOWNLOAD"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent - filter>
</service>
- 在这个例子中,
DownloadService
除了响应START_DOWNLOAD
动作外,还属于DEFAULT
类别,这有助于在使用隐式意图调用服务时更准确地匹配。
1.9.2.1.3. <data>
- 含义:用于指定与意图相关的数据的类型、格式和位置等信息。在服务中,这可以用于处理特定类型的数据相关操作。例如,一个文件处理服务可能会根据数据的 MIME 类型或者 URI 来处理文件。
- 示例:
<service android:name=".FileService">
<intent - filter>
<action android:name="com.example.file.PROCESS_FILE"/>
<data android:mimeType="text/plain"/>
</intent - filter>
</service>
- 此
FileService
可以响应PROCESS_FILE
动作,并且处理的数据类型是纯文本(text/plain
),可能用于读取、修改或其他文本文件相关的操作。
1.9.2.2. <meta - data>
- 含义:用于为 Service 提供额外的自定义数据。这些数据可以在 Service 的代码中获取,用于配置 Service 的特殊行为或者传递一些信息。
- 示例:
<service android:name=".MyService">
<meta - data
android:name="custom_key"
android:value="custom_value"/>
</service>
- 此 Service 有一个名为
custom_key
的元数据,其值为custom_value
,在 Service 的onCreate()
或其他合适的方法中,可以通过相应的 API 获取这些元数据来进行处理。
1.9.3. <receiver>
- 含义:Broadcast Receiver 用于接收系统或应用发出的广播消息。例如,电池电量变化、网络连接变化等广播都可以被接收。
- 示例:
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name">
<receiver android:name=".MyReceiver">
<intent - filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
</intent - filter>
</receiver>
</application>
- 这个
MyReceiver
广播接收器可以接收网络连接改变的广播消息,当网络状态发生变化时,应用可以根据这个广播来执行相应的操作。
属性
android:name
- 含义:用于指定 Broadcast Receiver 的类名。可以是完整的包名和类名(如
com.example.myapp.MyReceiver
),也可以是相对路径(如.MyReceiver
,它会基于清单文件中的package
属性来确定完整的类名)。这是在清单文件中标识 Broadcast Receiver 的关键属性。 - 示例:
- 含义:用于指定 Broadcast Receiver 的类名。可以是完整的包名和类名(如
<receiver android:name=".MyReceiver">
<intent - filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
</intent - filter>
</receiver>
android:enabled
- 含义:一个布尔值属性,用于确定 Broadcast Receiver 是否启用。如果设置为
false
,则该接收器无法接收广播,默认值为true
。这可以用于在某些情况下(如根据用户配置或设备条件)禁用特定的 Broadcast Receiver。 - 示例:
- 含义:一个布尔值属性,用于确定 Broadcast Receiver 是否启用。如果设置为
<receiver android:name=".MyReceiver"
android:enabled="false">
<intent - filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
</intent - filter>
</receiver>
android:exported
- 含义:一个布尔值属性,用于指定 Broadcast Receiver 是否可以接收来自其他应用的广播。如果设置为
true
,则可以接收外部应用发送的广播;如果设置为false
(默认值),则只能接收本应用内部发送的广播。 - 示例:
- 含义:一个布尔值属性,用于指定 Broadcast Receiver 是否可以接收来自其他应用的广播。如果设置为
<receiver android:name=".InternalReceiver"
android:exported="false">
<intent - filter>
<action android:name="com.example.myapp.INTERNAL_ACTION"/>
</intent - filter>
</receiver>
android:icon
- 含义:用于指定 Broadcast Receiver 的图标。这个图标可能在某些调试或管理工具中显示,用于标识 Broadcast Receiver。通常引用
drawable
资源,如@drawable/receiver_icon
。不过,在实际应用中,Broadcast Receiver 图标使用场景相对较少。 - 示例:
- 含义:用于指定 Broadcast Receiver 的图标。这个图标可能在某些调试或管理工具中显示,用于标识 Broadcast Receiver。通常引用
<receiver android:name=".VisibleReceiver"
android:icon="@drawable/receiver_icon">
<intent - filter>
<action android:name="android.bluetooth.adapter.action.STATE_CHANGED"/>
</intent - filter>
</receiver>
android:label
- 含义:用于设置 Broadcast Receiver 的标签或名称。这个名称可能在调试工具、系统广播管理界面等地方显示,用于标识 Broadcast Receiver。一般引用
string
资源,如@string/receiver_label
。 - 示例:
- 含义:用于设置 Broadcast Receiver 的标签或名称。这个名称可能在调试工具、系统广播管理界面等地方显示,用于标识 Broadcast Receiver。一般引用
<receiver android:name=".NamedReceiver"
android:label="@string/receiver_label">
<intent - filter>
<action android:name="android.intent.action.BATTERY_CHANGED"/>
</intent - filter>
</receiver>
android:permission
- 含义:用于指定发送广播到这个 Broadcast Receiver 所需的权限。如果其他组件(包括其他应用中的组件)想要向这个接收器发送广播,需要拥有这个指定的权限。
- 示例:
<receiver android:name=".ProtectedReceiver"
android:permission="com.example.myapp.SEND_BROADCAST_TO_RECEIVER">
<intent - filter>
<action android:name="com.example.myapp.PROTECTED_ACTION"/>
</intent - filter>
</receiver>
1.9.3.1. <intent - filter>
- 含义:这是 Broadcast Receiver 中最重要的标签之一。它用于指定该接收器能够接收的广播意图类型。通过在
intent - filter
中定义动作(<action>
)、类别(<category>
)和数据(<data>
)等元素,来匹配系统或应用发出的广播。 - 示例:
<receiver android:name=".MyReceiver">
<intent - filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
</intent - filter>
</receiver>
- 在这个例子中,
MyReceiver
可以接收网络连接改变(android.net.conn.CONNECTIVITY_CHANGE
)的广播。当网络状态发生变化时,系统会发送这个广播,MyReceiver
就能够捕获并处理它。
1.9.3.2. <meta - data>
- 含义:用于为 Broadcast Receiver 提供额外的自定义数据。这些数据可以在接收器的代码中获取,用于配置接收器的特殊行为或者传递一些信息。
- 示例:
<receiver android:name=".MyReceiver">
<meta - data
android:name="custom_key"
android:value="custom_value"/>
</receiver>
- 这里
MyReceiver
有一个名为custom_key
的元数据,其值为custom_value
。在接收器的onReceive()
方法或者其他合适的地方,可以通过相应的 API 获取这些元数据来进行处理,比如根据这个自定义数据来决定是否处理接收到的广播。
1.9.4. <provider>
- 含义:Content Provider 用于在不同的应用之间共享数据。例如,一个应用可以通过 Content Provider 将自己的数据(如联系人、短信等)提供给其他应用访问。
- 示例:
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name">
<provider
android:name=".MyContentProvider"
android:authorities="com.example.myapplication.provider">
</provider>
</application>
android:name
指定了 Content Provider 的类名,android:authorities
定义了一个唯一的标识,其他应用可以通过这个标识来访问该 Content Provider 提供的数据。
属性
android:name
- 含义:用于指定 Content Provider 的类名。可以是完整的包名和类名(如
com.example.myapp.MyContentProvider
),也可以是相对路径(如.MyContentProvider
,它会基于清单文件中的package
属性来确定完整的类名)。这是在清单文件中标识 Content Provider 的关键属性。 - 示例:
- 含义:用于指定 Content Provider 的类名。可以是完整的包名和类名(如
<provider
android:name=".MyContentProvider"
android:authorities="com.example.myapplication.provider">
<!-- 其他标签 -->
</provider>
android:authorities
- 含义:定义一个唯一的标识,用于其他应用访问该 Content Provider 提供的数据。这个标识通常是一个字符串,格式类似于域名反转的形式,并且在整个系统中应该是唯一的。
- 示例:
<provider
android:name=".MyContentProvider"
android:authorities="com.example.myapplication.provider">
<!-- 其他标签 -->
</provider>
android:enabled
- 含义:一个布尔值属性,用于确定 Content Provider 是否启用。如果设置为
false
,则 Content Provider 无法被访问,默认值为true
。这可以用于在某些情况下(如根据用户配置或设备条件)禁用特定的 Content Provider。 - 示例:
- 含义:一个布尔值属性,用于确定 Content Provider 是否启用。如果设置为
<provider
android:name=".MyContentProvider"
android:authorities="com.example.myapplication.provider"
android:enabled="false">
<!-- 其他标签 -->
</provider>
android:exported
- 含义:一个布尔值属性,用于指定 Content Provider 是否可以被其他应用访问。如果设置为
true
,则可以被外部应用访问;如果设置为false
(默认值),则只能在本应用内部访问。 - 示例:
- 含义:一个布尔值属性,用于指定 Content Provider 是否可以被其他应用访问。如果设置为
<provider
android:name=".MyContentProvider"
android:authorities="com.example.myapplication.provider"
android:exported="false">
<!-- 其他标签 -->
</provider>
android:grantUriPermissions
- 含义:一个布尔值属性,用于指定是否允许临时授予对 Content Provider 中 URI 的访问权限。如果设置为
true
,可以通过ContentResolver
的相关方法在运行时动态地授予其他应用对特定 URI 的访问权限。默认值为false
。 - 示例:
- 含义:一个布尔值属性,用于指定是否允许临时授予对 Content Provider 中 URI 的访问权限。如果设置为
<provider
android:name=".MyContentProvider"
android:authorities="com.example.myapplication.provider"
android:grantUriPermissions="true">
<!-- 其他标签 -->
</provider>
android:icon
- 含义:用于指定 Content Provider 的图标。这个图标可能在某些调试或管理工具中显示,用于标识 Content Provider。通常引用
drawable
资源,如@drawable/provider_icon
。不过,在实际应用中,Content Provider 图标使用场景相对较少。 - 示例:
- 含义:用于指定 Content Provider 的图标。这个图标可能在某些调试或管理工具中显示,用于标识 Content Provider。通常引用
<provider
android:name=".MyContentProvider"
android:authorities="com.example.myapplication.provider"
android:icon="@drawable/provider_icon">
<!-- 其他标签 -->
</provider>
android:label
- 含义:用于设置 Content Provider 的标签或名称。这个名称可能在调试工具、系统内容提供管理界面等地方显示,用于标识 Content Provider。一般引用
string
资源,如@string/provider_label
。 - 示例:
- 含义:用于设置 Content Provider 的标签或名称。这个名称可能在调试工具、系统内容提供管理界面等地方显示,用于标识 Content Provider。一般引用
<provider
android:name=".MyContentProvider"
android:authorities="com.example.myapplication.provider"
android:label="@string/provider_label">
<!-- 其他标签 -->
</provider>
android:multiprocess
- 含义:一个布尔值属性,用于指定 Content Provider 是否在每个访问它的进程中都创建一个实例。如果设置为
true
,每个进程都会有自己的 Content Provider 实例;如果设置为false
(默认值),Content Provider 在整个应用的进程中共享一个实例。 - 示例:
- 含义:一个布尔值属性,用于指定 Content Provider 是否在每个访问它的进程中都创建一个实例。如果设置为
<provider
android:name=".MyContentProvider"
android:authorities="com.example.myapplication.provider"
android:multiprocess="true">
<!-- 其他标签 -->
</provider>
android:permission
- 含义:用于指定访问这个 Content Provider 所需的权限。如果其他组件(包括其他应用中的组件)想要访问这个 Content Provider,需要拥有这个指定的权限。
- 示例:
<provider
android:name=".MyContentProvider"
android:authorities="com.example.myapplication.provider"
android:permission="com.example.myapp.ACCESS_PROVIDER">
<!-- 其他标签 -->
</provider>
android:process
- 含义:用于指定 Content Provider 运行的进程。默认情况下,Content Provider 在应用的主进程中运行,但可以通过这个属性为 Content Provider 指定单独的进程,这样可以在一定程度上隔离 Content Provider 的运行环境,提高应用的稳定性和性能。
- 示例:
<provider
android:name=".MyContentProvider"
android:authorities="com.example.myapplication.provider"
android:process=":provider_process">
<!-- 其他标签 -->
</provider>
1.9.4.1. <grant - uri - permission>
- 含义:用于控制对Content Provider所提供数据的URI级别的访问权限。它可以有不同的属性来指定权限的范围,例如可以是针对特定的路径、路径模式或者所有的子路径等。这有助于精细地控制其他应用对Content Provider数据的访问。
- 示例:
<provider
android:name=".MyContentProvider"
android:authorities="com.example.myapplication.provider">
<grant - uri - permission android:path="/data/user"/>
</provider>
- 在这个例子中,
grant - uri - permission
允许对/data/user
路径下的数据进行访问授权,其他应用在被授权的情况下可以访问Content Provider中该路径下的数据。
1.9.4.2. <meta - data>
- 含义:和其他组件(如Activity、Service等)中的
meta - data
类似,用于为Content Provider提供额外的自定义数据。这些数据可以在Content Provider的代码中获取,用于配置特殊行为或者传递一些信息。 - 示例:
<provider
android:name=".MyContentProvider"
android:authorities="com.example.myapplication.provider">
<meta - data
android:name="custom_key"
android:value="custom_value"/>
</provider>
- 这里
MyContentProvider
有一个名为custom_key
的元数据,其值为custom_value
,在Content Provider的onCreate()
或其他合适的方法中,可以通过相应的API获取这些元数据来进行处理。
1.9.4.3. <path - permission>
- 含义:用于定义对Content Provider中特定路径的更详细的权限设置。可以指定读取、写入等权限,并且可以根据不同的路径或者路径模式来设置不同的权限规则,这对于保护Content Provider中的数据安全和隐私非常重要。
- 示例:
<provider
android:name=".MyContentProvider"
android:authorities="com.example.myapplication.provider">
<path - permission
android:path="/private/data"
android:readPermission="com.example.myapp.READ_PRIVATE_DATA"
android:writePermission="com.example.myapp.WRITE_PRIVATE_DATA"/>
</provider>
- 在这个例子中,对于
/private/data
路径下的数据,设置了读取权限为com.example.myapp.READ_PRIVATE_DATA
,写入权限为com.example.myapp.WRITE_PRIVATE_DATA
,这样可以精确地控制对Content Provider中敏感数据的访问。
1.9.5. <meta - data>
- 含义:可以用来为应用组件(如Activity、Service等)提供额外的自定义数据。这些数据可以是字符串、整数等各种类型,用于配置组件的特殊行为或者传递一些信息。
- 示例:
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name">
<activity android:name=".MyActivity">
<meta - data
android:name="custom_key"
android:value="custom_value"/>
</activity>
</application>
- 在这个例子中,
MyActivity
有一个名为custom_key
的元数据,其值为custom_value
,在代码中可以获取这些元数据来进行相应的处理。
1.9.6. <activity - alias>
- 含义:用于为一个已有的Activity创建别名。可以通过别名来启动原始的Activity,并且可以为别名设置不同的
intent - filter
等属性,从而实现不同的启动方式或者功能。 - 示例:
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name">
<activity android:name=".OriginalActivity">
</activity>
<activity - alias
android:name=".AliasActivity"
android:targetActivity=".OriginalActivity">
<intent - filter>
<action android:name="android.intent.action.ALIAS_ACTION"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent - filter>
</activity - alias>
</application>
- 这里
AliasActivity
是OriginalActivity
的别名,通过AliasActivity
的intent - filter
定义,可以使用ALIAS_ACTION
这个动作来启动OriginalActivity
。
1.9.7. <service - alias>
- 含义:类似于
activity - alias
,是为已有服务创建别名的标签。 - 示例:
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name">
<service android:name=".OriginalService">
</service>
<service - alias
android:name=".AliasService"
android:targetService=".OriginalService">
</service - alias>
</application>
- 可以通过
AliasService
来引用OriginalService
,并且在某些场景下可以为别名服务设置不同的属性。