Android Manifest.xml

一、概述

Manifest.xml是每个android程序中必须的文件,它位于整个项目的根目录。里面配置了程序运行所必要的组件、权限,以及一些相关信息。

二、结构图

<?xmlversion="1.0"encoding="utf-8"?>
<manifest>
 
    <uses-sdk/> 
    <uses-configuration/> 
    <uses-feature/>  
 
    <uses-permission/>
    <permission/>
    <permission-tree/>
    <permission-group/>
    <instrumentation/> 
 
    <supports-screens/>
 
    <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>  
 
</manifest>

三、详解

1、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>

(1)xmlns:android

定义android命名空间,这样使得Android中各种标准属性能在文件中使用。

(2)package

指定本应用内java主程序包的包名,它也是一个应用进程的默认名称。

(3)sharedUserId

表明数据权限,因为默认情况下,Android给每个APK分配一个唯一的UserID,所以默认禁止不同APK访问共享数据的。若要共享数据,第一可以采用Share Preferences方法,第二种就可以采用sharedUserId,将不同APK的sharedUserId都设为一样,同这些APK之间就可以互相共享数据了。

(4)sharedUserLabel

一个共享的用户名,它只有在设置了sharedUserId属性的前提下才会有意义。

(5)versionCode

是给设备程序识别版本(升级)用的,必须是一个integer值,代表app更新过多少次,比如第一版一般为1,之后若要更新版本就设置为2、3等等。

(6)versionName

这个名称是给用户看的,你可以将你的APP版本设置为1.1版,后续更新版本设置为1.2、2.0版本等等。

(7)installLocation

安装参数,是Android2.2中的一个特性,installLocation有三个值可以选择:

选择preferExternal,系统会优先考虑将APK安装到SD卡上(当然最终用户可以选择内部ROM存储上,如果SD存储已满,也会安装到内部存储上)

选择auto,系统将会根据存储空间自己去适应。

选择internalOnly是指必须安装到内部才能运行。

 

2、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>

(1)android:allowClearUserData

用户是否能选择自行清除数据,默认为true,当为true时,用户可自己清理用户数据,反之亦然。

(2)android:allowTaskReparenting

是否允许activity更换从属的任务,比如从短信息任务切换到浏览器任务。

(3)android:backupAgent

属性值应该是一个完整的类名,如com.project.TestCase,此属性并没有默认值,并且类名必须得指定(就是个备份工具,将数据备份到云端的操作)。

(4)android:debuggable

当设置为true时,表明该APP在手机上可以被调试,默认为false,在false的情况下调试该APP,会报错。

(5)android:description/android:label

此两个属性为许可提供的,均为字符串资源,当用户去看许可列表(android:label)或者某个许可的详细信息(android:description)时,这些字符串资源就可以显示给用户。我们通常用两名话来描述话可,第一句描述许可,第二句警告用户如果批准该权限会可能有会么不好的事情发生。

(6)android:enabled

Android系统是否能够实例化该应用程序的组件,如果为true,每个组件的enabled属性决定是否可以被enabled,如果为false,它覆盖组件指定的值,所有组件都是disabled。

(7)android:hasCode

表示此APP是否包含任何的Java代码,默认为true,若为false,则系统在运行组件时,不会去尝试加载任何的APP代码

(8)android:icon

整个app的图标,图片一般都放在drawable文件夹下。

(9)android:name

为应用程序所实现的Application子类的全名。当应用程序进程开始时,该类在所有应用程序组件之前被实例化。

(10)android:permission

设置话可名,这个属性若定义的话,是给应用程序的所有组件设置许可的便捷方式,当然它是被各组件设置的许可名所覆盖。

(11)android:presistent

该应用程序是否应该在任何时候都保持运行状态,默认为false。因为应用程序通常不应该设置本标识,持续模式仅仅应该给某些系统应用程序才有意义。

(12)android:process

应用程序运行的进程名,它的默认值为元素里设置的包名,当然每个组件都可以通过设置该属性来覆盖默认值。如果你有两个应用程序共用一个进程的话,你可以设置他们的android:process相同,但前掉条件是他们共享一个用户ID及赋予了相同证书的时候。

(13)android:restoreAnyVersion

用来表明应用是否准备尝试恢复所有的备份,甚至该备份是比当前设备上更新的版本,默认是false

(14)android:taskAffinity

拥有相同的affinity的Activity理论上属于相同的Task,应用程序默认的affinity的名字是元素中设定的package名。

(15)android:theme

是一个资源的风格,它定义了一个默认的主题风格给所有activity,当然也可以在自己的theme里面去设置它,有点类似style。

3、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>

(1)android:alwaysRetainTaskState

是否保留状态不变,比如切换回home,再从新打开,activity处于最后的状态。比如一个浏览器拥有很多状态(当打开多个TAB的时候),用户并不希望丢失这些状态,此时可将些属性设置为true。

(2)android:clearTaskOnLauch

比如P是activity,Q是被P触发的activity,然后返回Home,重新启动P,是否显示Q。

(3)android:configChanges

当配置list发生修改时,是否调用onConfigurationChanged()方法,比如“locale|navigation|orientation”。

正常情况下,如果手机旋转了,当前Acitivity会杀掉,然后根据方向重新加载这个Activity,就会从onCreate开始重新加载。

如果设置了这个选项,当手机旋转后,当前Activity会调用onConfigurationChanged()方法,而不是跑onCreate方法等。

(4)android:excludeFromRecents

是否可被显示在最近打开的activity列表里,默认是false.

(5)android:finishOnTaskLaunch

当用户重新启动这个任务的时候,是否关闭已打开的activity,默认是false。

(6)android:lauchMode

默认是standard

standard:就是intent将发送给新的实例,所以每次跳转都会生成新的activity。

singleTop:也是发送给新的实例,但不同standard的一点是,在请求的Activity正好位于栈顶时,不会构造新的实例。

singleTask:当intent到来,需要创建设置为singleTask的Activity的时候,系统会检查栈里面是否已经有该Activity的实例,如果有直接将intent发送给它。

singleInstance:首先说明一下task这个概念,Task可以认为是一个栈,可以放入多个Activity。比如启动一个应用,那么Android就创建一个Task,然后启动这个应用的入口Activity,那在它的界面上调用其他的Activity也只是在这个Task里面。那如果在多个task中共享一个Activity的话怎么办呢?举个例子,如果开启一个导游服务类的应用程序,里面有个Activity是开启Google地图,当按下home键退回主菜单又启动Google地图的应用时,显示的就是刚才的地图,实际上是同一个Activity,实际上这就引入了singleInstance。singleInstance模式是将该Activity单独放入一个栈中,这样这个栈中只有这个Activity,不同应用的intent都由这个Activity接收和展示,这样就做到了共享,当然前提是这些应用都没被销毁,所以刚才是按下Home键,如果按下了返回键,则无效。

(7)android:multiprocess

是否允许多进程,默认是false.

(8)android:noHistory

当用户从Activity上离开并且它的屏幕上不可再见时,Activity是否从Activity stack中清除并结束。

(9)android:screentOrientation

activity显示的模式,默认是unspecified,由系统自动判断显示方向

landscape横屏模式,宽度比高度大。

portrait竖屏模式,高度比宽度大。

user模式,用户当前首选的方向

behind模式,和该Activity下面的那个Activity的方向一致

sensor模式:和物理的感应器来决定,如果用户旋转设备这个屏幕会横竖屏切换。

nosensor模式:忽略物理感应器。

(10)android:stateNotNeeded

activity被销毁或者成功重启时是否保存状态。

(11)android:windowSoftInputMode

activity主窗口与软键盘的交互模式,可以用来避免输入法面板遮挡问题。

这个属性能影响两件事情:

当有焦点产生时,软键盘是隐藏还是显示。

是否减少活动主窗口大小以便腾出空间放软键盘。

各值的含义:

stateUnspecified,软键盘的状态并没有指定,系统将选择一个合适的状态或依赖于主题的设置。

stateUnchanged,当这个activity出现时,软键盘将一直何足保持在上一个activity里的状态,无论是隐藏还是显示。

stateHidden,用户选择activity时,软键盘总是被隐藏。

stateAlwaysHidden,当该Activity主窗口获取焦点时,软键盘也总是被隐藏。

stateVisible,软键盘通常是可见的。

adjustUnspecified,l默认设置,通常由系统自行决定是隐藏还是显示。

adjustResize,该Activity总是调整屏幕的大小以更流出软键盘的空间。

adjustPan,当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户总是看到输入内容的部分。

4、intent-filter属性

<intent-filter  android:icon="drawable resource"
               android:label="string resource"
               android:priority="integer" >
 
      <action />
 
      <category />
 
      <data />
 
</intent-filter> 
 

1.android:priority

有序广播主要按照声明的优先级,如A的级别高于B,那么广播先传给A,再传给B。优先级别就是用设置priority属性来确定,范围从-1000~1000,数越大优先级越高。

2.action

只有android:name这个属性,常见的android:name值为android.intent.action.MAIN,表明此activity是作为应用程序的入口。

3.category

也只有android:name属性,常见的android:name值为android.intent.category.LAUNCHER(决定应用程序是否显示在程序列表里)

5、meta-data属性

<meta-data android:name="string"
           android:resource="resource specification"
           android:value="string"/>

1.android:name

元数据项的名字,为了保证这个名字是唯一的,采用java风格的命名规范。

2.android:resource

资源的一个引用,指定给这个项的值是该资源的id。

3.android:value

指定给这一项的值。

6、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>

是为activity创建快捷方式的。

7、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>

service标签内的属性之前已有描述,在此不重复。

8、Receiver

receiver的属性与service一样。

9、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>

1. android:authorities

标识这个ContentProvider,调用者可以根据这个标识来找到它。

2. android:grantUriPermission

对某个URI授予的权限。

10、uses-library

用户库,可自定义,所有android的包都可以引用。

11、support-screens

 
 
<supports-screens  android:smallScreens=["true" | "false"] 
                  android:normalScreens=["true" | "false"] 
                  android:largeScreens=["true" | "false"] 
                  android:anyDensity=["true" | "false"] />

是否支持大屏,是否支持中屏,是否支持小屏,是否支持多种不同密度。

12、uses-configuration与uses-feature性能都差不多

<uses-configuration  android:reqFiveWayNav=["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"] />
 
<uses-feature android:glEsVersion="integer"
              android:name="string"
              android:required=["true" | "false"] />

这两者都是描述应用所需要的硬件和软件特性,以便防止应用在没有这些特性的设备上安装。

13、uses-sdk

<uses-sdk android:minSdkVersion="integer"
          android:targetSdkVersion="integer"
          android:maxSdkVersion="integer"/>

描述应用所需的api level

14、instrumentation

 
<instrumentation android:functionalTest=["true" | "false"]
                 android:handleProfiling=["true" | "false"]
                 android:icon="drawable resource"
                 android:label="string resource"
                 android:name="string"
                 android:targetPackage="string"/>

定义一些用于探测和分析应用性能等待相关的类,可以监控程序。在各个应用程序的组件之前instrumentation类被实例化。

15、permission , uses-permission, permission-tree, permission-group区别

 

/**获取APP版本号
     * @param context
     * @return
     */
    public static String getAppVersion(Context context) {
         try {
            // 获取packagemanager的实例
            PackageManager packageManager = context.getPackageManager();
            // getPackageName()是你当前类的包名,0代表是获取版本信息
            PackageInfo packInfo = packageManager.getPackageInfo(context.getPackageName(),0);
            String version = packInfo.versionName;
            return version;
        } catch (NameNotFoundException e) {
            e.printStackTrace();
        }
         return null;
    }
 
    /**
     * get android os version no
     * @return
     */
    public static float getAndroidVersion() {
        return Float.valueOf(android.os.Build.VERSION.RELEASE);
    }
 
    /**
     * get device model
     * @return
     */
    public String getDeviceModel () {
        return android.os.Build.MODEL;
    }
 
    /**
     * get android os sdk version  2.2 = 8,2.3 = 9,4.2.1 = 17
     * @return sdk version
     */
    public static int getSDKVersion(){
        return android.os.Build.VERSION.SDK_INT;
    }

 

最后欢迎大家访问我的个人网站:1024s​​​​​​​

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值