Android AndroidManifest.xml 简介

AndroidManifest.xml 是Android应用的入口文件,为系统提供应用的必要信息,系统必须具有这些信息才能正常运行。

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

  • 为应用的 Java 包命名。包名称充当应用的唯一标识符。
  • 描述应用的各个组件,包括构成应用的 Activity、服务、广播接收器和内容提供程序。它还为实现每个组件的类命名并发布其功能,例如它们可以处理的 Intent 消息。这些声明向 Android 系统告知有关组件以及可以启动这些组件的条件的信息。
  • 确定托管应用组件的进程。
  • 声明应用必须具备哪些权限才能访问 API 中受保护的部分并与其他应用交互。还声明其他应用与该应用组件交互所需具备的权限
  • 列出 Instrumentation 类,这些类可在应用运行时提供分析和其他信息。这些声明只会在应用处于开发阶段时出现在清单中,在应用发布之前将移除。
  • 声明应用所需的最低 Android API 级别
  • 列出应用必须链接到的库

《Android AndroidManifest.xml 简介》 manifests文件图

1. 文件结构

下面的代码段显示了清单文件的通用结构及其可包含的每个元素。每个元素及其所有属性全部记录在一个单独的文件中。

下面是清单文件的示例:

<?xmlversion="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/>
    <supports-screens/>

    <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>
2. 文件约定

1)元素
只有 <manifest><application> 元素是必需的,它们都必须存在并且只能出现一次。其他大部分元素可以出现多次或者根本不出现。但清单文件中必须至少存在其中某些元素才有用。

同一级别的元素通常不分先后顺序。例如,<activity><provider><service> 元素可以按任何顺序混合在一起。这条规则有两个主要例外:

  • <activity-alias> 元素必须跟在别名所指的 <activity> 之后。
  • <application> 元素必须是 <manifest> 元素内最后一个元素。换而言之,</manifest> 结束标记必须紧接在 </application> 结束标记后。

2)属性
从某种意义上说,所有属性都是可选的。但是,必须指定某些属性,元素才可实现其目的。

  • Manifest 属性
<manifest  xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.finddreams.csdn"
          android:sharedUserId="string"
          android:sharedUserLabel="string resource"
          android:versionCode="integer"
          android:versionName="string"
          android:installLocation=["auto" | "internalOnly" | "preferExternal"] >
</manifest>
  • Application 属性
<application  android:allowClearUserData=["true" | "false"]
             android:allowTaskReparenting=["true" | "false"]
             android:backupAgent="string"
             android:debuggable=["true" | "false"]
             android:description="string resource"
             android:enabled=["true" | "false"]
             android:hasCode=["true" | "false"]
             android:icon="drawable resource"
             android:killAfterRestore=["true" | "false"]
             android:label="string resource"
             android:manageSpaceActivity="string"
             android:name="string"
             android:permission="string"
             android:persistent=["true" | "false"]
             android:process="string"
             android:restoreAnyVersion=["true" | "false"]
             android:taskAffinity="string"
             android:theme="resource or theme" >
</application>
  • Activity 属性
<activity android:allowTaskReparenting=["true" | "false"]
          android:alwaysRetainTaskState=["true" | "false"]
          android:clearTaskOnLaunch=["true" | "false"]
          android:configChanges=["mcc", "mnc", "locale",
                                 "touchscreen", "keyboard", "keyboardHidden",
                                 "navigation", "orientation", "screenLayout",
                                 "fontScale", "uiMode"]
          android:enabled=["true" | "false"]
          android:excludeFromRecents=["true" | "false"]
          android:exported=["true" | "false"]
          android:finishOnTaskLaunch=["true" | "false"]
          android:icon="drawable resource"
          android:label="string resource"
          android:launchMode=["multiple" | "singleTop" |
                              "singleTask" | "singleInstance"]
          android:multiprocess=["true" | "false"]
          android:name="string"
          android:noHistory=["true" | "false"]  
          android:permission="string"
          android:process="string"
          android:screenOrientation=["unspecified" | "user" | "behind" |
                                     "landscape" | "portrait" |
                                     "sensor" | "nosensor"]
          android:stateNotNeeded=["true" | "false"]
          android:taskAffinity="string"
          android:theme="resource or theme"
          android:windowSoftInputMode=["stateUnspecified",
                                       "stateUnchanged", "stateHidden",
                                       "stateAlwaysHidden", "stateVisible",
                                       "stateAlwaysVisible", "adjustUnspecified",
                                       "adjustResize", "adjustPan"] >   
</activity>
  • 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">
    <intent-filter/> 
    <meta-data/>
</activity-alias>
  • Service 属性
<service android:enabled=["true" | "false"]
         android:exported[="true" | "false"]
         android:icon="drawable resource"
         android:label="string resource"
         android:name="string"
         android:permission="string"
         android:process="string">
</service>
  • Provider 属性
<provider android:authorities="list"
          android:enabled=["true" | "false"]
          android:exported=["true" | "false"]
          android:grantUriPermissions=["true" | "false"]
          android:icon="drawable resource"
          android:initOrder="integer"
          android:label="string resource"
          android:multiprocess=["true" | "false"]
          android:name="string"
          android:permission="string"
          android:process="string"
          android:readPermission="string"
          android:syncable=["true" | "false"]
          android:writePermission="string">
    <grant-uri-permission/>
    <meta-data/>
</provider>
  • supports-screens 属性
<supports-screens  
       android:smallScreens=["true" | "false"] 
       android:normalScreens=["true" | "false"] 
       android:largeScreens=["true" | "false"] 
       android:anyDensity=["true" | "false"] />
  • intent-filter 属性
<intent-filter  
        android:icon="drawable resource"
        android:label="string resource"
        android:priority="integer" >
   <action />
   <category />
   <data />
</intent-filter> 
  • data 属性
<data  android:host="string"
    android:mimeType="string"
    android:path="string"
    android:pathPattern="string"
    android:pathPrefix="string"
    android:port="string"
    android:scheme="string"/>

3)声明类名
许多元素对应于 Java 对象,包括应用本身的元素(<application> 元素)及其主要组件:Activity (<activity>)、服务 (<service>)、广播接收器 (<receiver>) 以及内容提供程序 (<provider>)。

ActivityServiceBroadcastReceiverContentProvider都需要子类通过 name 属性来声明。该名称必须包含完整的包名称。例如,Service 子类可能会声明如下:

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

但是,如果字符串的第一个字符是句点,则应用的包名称(如 <manifest> 元素的 package 属性所指定)将添加到该字符串。例如:

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

当启动组件时,Android 系统会创建已命名子类的实例。如果未指定子类,则会创建基类的实例。

4)多个值

如果可以指定多个值,则几乎总是在重复此元素,而不是列出单个元素内的多个值。例如,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>
    原文作者:翻译不了的声响
    原文地址: https://www.jianshu.com/p/a40cf35283c3
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞