联系方式:
简书:WillFlow
CSDN:WillFlow
微信公众号:WillFlow
AndroidManifest.xml清单文件是每个Android程序中必须的文件,它是整个Android程序的全局描述文件,除了能声明程序中的Activities,Content Providers,Services,和Intent Receivers,还能指定应用的名称、使用的图标、包含的组件以及permissions和instrumentation(安全控制和测试)。
我们这里给出之前Hello World工程中的清单文件源代码并加以分析,然后给出通用的清单文件结构以及各个节点的详细介绍,便于日后查阅。(持续更新中…)
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.wgh.helloworld">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
intent-filter>
activity>
application>
manifest>
<manifest>
<application>
<activity>
<intent-filter>
<action/>
<category/>
intent-filter>
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/>
provider>
<uses-library/>
application>
<uses-permission/>
<permission/>
<permission-tree/>
<permission-group/>
<instrumentation/>
<uses-sdk/>
<uses-configuration/>
<uses-feature/>
<supports-screens/>
manifest>
"http://schemas.android.com/apk/res/android"
package="com.woody.test"
android:sharedUserId="string"
android:sharedUserLabel="string resource"
android:versionCode="integer"
android:versionName="string"
android:installLocation=["auto" | "internalOnly" | "preferExternal"] >
注:需要进行后台类监控的APP最好安装在内部,而一些较大的游戏APP最好安装在SD卡上。默认为安装在内部,如果把APP安装在SD卡上,首先得设置level为8,并且要配置android:installLocation这个参数的属性为preferExternal
"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" >
"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"]
<intent-filter android:icon="drawable resource"
android:label="string resource"
android:priority="integer" >
<action />
<category />
<data />
intent-filter>
<data android:host="string"
android:mimeType="string"
android:path="string"
android:pathPattern="string"
android:pathPrefix="string"
android:port="string"
android:scheme="string"
/>
"string"
android:resource="resource specification"
android:value="string"/>
这是该元素的基本结构,它可以包含在 四个元素中。
- android:name
元数据项的名字,为了保证这个名字是唯一的,采用java风格的命名规范,如com.woody.project.fried。
- android:resource
资源的一个引用,指定给这个项的值是该资源的id。该id可以通过方法Bundle.getInt()来从meta-data中找到。
- android:value
指定给这一项的值。可以作为值来指定的数据类型并且组件用来找回那些值的Bundle方法:[getString],[getInt],[getFloat],[getBoolean]。
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">
filter/>
alias>
<activity android:name=".shortcut">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
intent-filter>
activity>
<activity-alias android:name=".CreateShortcuts" android:targetActivity=".shortcut"android:label="@string/shortcut">
<intent-filter>
<action android:name="android.intent.action.CREATE_SHORTCUT" />
<category android:name="android.intent.category.DEFAULT" />
intent-filter>
activity-alias>
其中android.targetActivity是指向对应快捷方式的activity,如上述的shortcut(此Activity名)android:label是指快捷方式的名称,而快捷方式的图标默认是给定的application图标。
"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">
用户库,可自定义,所有android的包都可以引用。
"true" | "false"]
android:normalScreens=["true" | "false"]
android:largeScreens=["true" | "false"]
android:anyDensity=["true" | "false"] />
这是在android1.6以后的新特性,支持多屏幕机制。
"true" | "false"]
android:reqHardKeyboard=["true" | "false"]
android:reqKeyboardType=["undefined" | "nokeys" | "qwerty" | "twelvekey"]
android:reqNavigation=["undefined" | "nonav" | "dpad" | "trackball" | "wheel"]
android:reqTouchScreen=["undefined" | "notouch" | "stylus" | "finger"] />
"integer"
android:name="string"
android:required=["true" | "false"] />
这两者都是在描述应用所需要的硬件和软件特性,以便防止应用在没有这些特性的设备上安装。
<uses-sdk android:minSdkVersion="integer"
android:targetSdkVersion="integer"
android:maxSdkVersion="integer"/>
描述应用所需的api level,也就是版本,比如android 2.2 = 8,android2.1 = 7,android1.6 = 4,android1.5=3,在此属性中可以指定支持的最小版本,目标版本以及最大版本。
"true" | "false"]
android:handleProfiling=["true" | "false"]
android:icon="drawable resource"
android:label="string resource"
android:name="string"
android:targetPackage="string"/>
定义一些用于探测和分析应用性能等相关的类,可以监控程序。在各个应用程序的组件之前instrumentation类被实例化。android:functionalTest:决定instrumentation类是否能运行一个功能测试,默认为false。
最常用的是,当我们需要获取某个权限的时候就必须在我们的manifest文件中声明,此与同级。通常情况下我们不需要为自己的应用程序声明某个权限,除非你提供了供其他应用程序调用的代码或者数据。这个时候你才需要使用 这个标签。很显然这个标签可以让我们声明自己的权限。比如:
<permission android:name="com.teleca.project.MY_SECURITY" . . . />
那么在activity中就可以声明该自定义权限了,如:
<application . . .>
<activity android:name="XXX" . . . >
android:permission="com.teleca.project.MY_SECURITY"> activity>
application>
当然自己声明的permission也不能随意的使用,还是需要使用来声明你需要的权限。 是声明一个标签,该标签代表了一组permissions,而是为一组permissions声明了一个namespace。