全面解析:Android之Manifest.xml文件的标签+属性

引言

  作为Android开发人员,我们通常更多地关注业务逻辑代码的书写逻辑,但很少去关注Manifest.xml配置文件中的标签和属性,最近我就因为在写业务的时候,误漏了一个该文件中的配置,导致业务逻辑梳理的时候溜得飞起,而运行app却处处崩溃。
  年轻人要讲武德!淦,虽然调试花了整整一个下午,但确实通过这件事认识到了我的短板。闲话不多说,一起来学习吧!

Manifest.xml文件结构目录





    
    
    
    
    
    
      
      
      
      
      
    
    
    
        
            
                
                
                
            
            
        
    
        
             . . . 
            
        
    
        
             . . . 
            
        
    
        
             . . . 
            
        
    
        
            
            
            
        
    
        
    
    


标签详细介绍

manifest


    . . .

(1)xmlns:android:定义android命名空间。
(2)package:定义app包名,每个app包名唯一。
(3)sharedUserId:具有相同的uderId并且具有相同签名的APP可以共享和访问彼此的数据,甚至可以在同一个进程里面运行,此时必须设置相同。
(4)sharedUserLabel:给共享userId定义了用户可读标签,只有设置了sharedUserId,此属性才有意义。
(5)versionCode:内部版本号。必须是整数,Integer类型。用来判断版本的升级,每一次发布都必须必之前的要大。如果versionName没有设置,则设置成此值。
(6)versionName:展示给用户看的版本号。为String类型。
(7)installLocation:设置apk文件的默认安装路径。

  • auto:系统优先安装apk包到内部存储,如果内部存储满了,则会安装到SD卡。

  • internalOnly:只能安装在设备ROM上(内部存储),ROM满了则弹出安装失败。

  • preferExternal,会优先安装在外部存储上(SD卡),当无SD卡或SD卡满了的话,则会安装到内部存储上。

  • uses-permission


(1)name:权限的名称。可以是系统定义的权限,也可以是其他应用的权限,或者是使用自定义的权限。
(2)maxSdkVersion:此申请的权限最高的作用Android版本。

  • permission

自定义权限,以限制访问指定的组件或APP——本APP或其他APP,起到保护的作用。

  • permission-tree

声明一个权限树,可以在此节点上动态添加权限。

  • permission-group

声明一个逻辑上的权限分组。

  • instrumentation

声明一个Instrumentation类,用来监控APP和系统的交互。Instrumentation对象会在APP的所有组件之前进行实例化。

  • uses-sdk

指定app运行需要的sdk级别

  • uses-configuration

用来设置APP需要的相关硬件和软件的配置。大部分APP都不需要此属性。

  • uses-feature

用来声明APP所要使用和依赖的单一的软硬件功能。

  • supports-screens

  • compatible-screens

  • supports-gl-texture

  • application(重头戏来啦!!!)


    . . .

(1)name:Application子类(自定义Application)的全名。
(2)taskAffinity:指定APP中所有的Activity所属的任务栈的名字。
(3)allowTaskReparenting:如果此属性设置了true,表明允许某个ActivityX从打开它的那个任务栈移动到它本来所属的taskAffinity任务栈的最上面。
(4)allowBackup:是否允许使用adb backup和adb restore进行数据的备份和恢复。
(5)allowClearUserData:是否允许应用重置用户数据。
(6)backupAgent:用来设置备份代理。
(7)backupInForeground:在allowBackup设置为true的前提下,自动备份(Auto Backup)操作是否在APP运行在前台的时候进行数据备份。
(8)banner:用来轮播图。
(9)debuggable:是否允许APP进入调试模式。一般不设置此值,由编译器自动打包对其进行赋值。
(10)label:用户可读的此APP的标签。
(11)description:关于此APP的详细描述。
(12)directBootAware:Android7.0引入的新特性,是否可以可以在Direct Boot模式下运行。
(13)enabled:是否让系统对application中的组件进行实例化。
(14)extractNativeLibs:Android6.0引入的。安装APK包时是否对其中的.so文件提取出来。
(15)fullBackupContent:Android6.0引入。配合自动备份,用一个XML文件指明备份数据的规则。
(16)fullBackupOnly:当自动备份(Auto Backup)可以使用的时候的时候,是否开启。
(17)hasCode:APP是否包含代码。
(18)hardwareAccelerated:是否为所有的Activity和View进行硬件加速渲染。
(19)icon:APP的桌面显示的图标。
(20)isGame:是否游戏,用来和其他应用区分开来。
(21)killAfterRestore: 当系统恢复出厂设置,APP的设置信息被重置时,改APP是否应该被杀死。
(22)largeHeap:APP是否需要更大的内存空间。
(23)label:APP桌面显示的名称。如果不指定,则桌面名称为包名。
(24)logo:actionBar或toolBar上显示的图标。
(25)manageSpaceActivity:Activity子类的全名。
(26)networkSecurityConfig:指向XML配置文件,此XML配置文件为网络安全配置文件。
(27)permission:设置权限。
(28)persistent:是否让此APP持续地保持运行。
(29)process:设置进程名字。
(30)restoreAnyVersion:APP可以通过任何版本的备份数据进行数据恢复,即使是高版本备份的数据恢复到低版本中去。
(31)resizeableActivity:APP是否设置分屏操作。API24 引入。
(32)supportsRtl:是否支持从右到左布局。
(33)testOnly:设置此APP是否是用来测试的。
(34)theme:APP的主题。
(35)uiOptions:有none和splitActionBarWhenNarrow两项属性值。none为默认值。一般很少用到此项。
(36)usesCleartextTraffic:API23引入。是否允许网络使用明文传输。默认值为true。
(37)vmSafeMode:API22引入。是否让虚拟机运行在安全模式下。默认值为false。

  • activity

    对Activity的声明,APP中的所有APP必须在Manifest文件中声明才能够显示。

    (1)name:Activity的子类全名。
    (2)allowEmbedded:此Activity是否可以作为其他Activity可嵌入的子Activity启动。在可穿戴的开发中此项需要设置为true。默认值为false。
    (3)taskAffinity:设置Activity所属任务栈的名称。
    (4)allowTaskReparenting:设置为true的时候:如果某个任务栈中的Activity启动了此Activity,则此Activity会移动到它本来所属的taskAffinity任务栈的最上面。
    (5)alwaysRetainTaskState:是否保持APP任务栈的状态。
    (6)autoRemoveFromRecents:当设置了此项的activity所启动的任务栈上的所有activity都关闭时,是否在预览屏幕(overview screen,其实也是最近人物列表)中移除。
    (7)clearTaskOnLaunch:当APP从桌面(Home Screen)切换回来是,是否移除掉任务栈上除了根Activity外的所有Activity,true为移除,false为不移除,默认值为false。此项只对根Activity起作用。
    (8)banner:在AndroidTV主页上的Activity进行轮播图片。
    (9)默认情况下当Activity的配置在运行时改变时,会被销毁掉并重启,此时一些信息会得不到保存,如输入框的信息,典型的例子就是横竖屏切换。配置此项的相关信息,可以避免配置改变带来的信息遗失,当设置的条件发生时,会触发Activity的onConfigurationChanged()回调方法。此项的值可以设置多种情况,用“|”分开。
    (10)directBootAware:Activity是否可以在锁屏的上运行和显示。
    (11)documentLaunchMode:Android 5.0添加。此项属性允许同一个APP能够有多个Activity展现在预览界面上(最近使用过的任务列表)。
    (12)enabled:Activity是否设置为系统进行实例化。默认值为true。
    (13)excludeFromRecents:以此Activity为根Activity的任务栈(task)是否从最近人物列表上移除,true为移除,false为包含。默认值为false。
    (14)exported:设置Activity是否可以被其他APP的组件启动。true可以;false不允许,不管是隐式调用还是显示调用。默认值为false。
    (15)finishOnTaskLaunch:当用户再次启动任务时(例如从预览界面切换),是否finish掉此Activity。默认值为false。当此项和allowTaskReparenting 同时设置为true时,会忽略掉allowTaskReparenting 属性。
    (16)hardwareAccelerated:开启硬件渲染加速。true为开启,false不开启。默认值为false。
    (17)icon:Activity的图标。作为任务栈的根Activity的icon可以在预览界面显示,并且会覆盖掉application的icon,也可以在intent-filter弹出的多选的activity显示icon。此项缺省的话和application设置的icon一样。
    (18)label:显示给用户看的Activity标签名。同icon显示的地方一样,一样会覆盖掉application的label。缺省的话和application设置的icon一样。
    (19)launchMode:Activity的四种启动模式。(standard |singleTop|singleTask|singleInstance)
    (20)maxRecents:以此Activity启动的任务栈(task)的最大数目,范围为1-50,默认值为16。超过数目会以最近最少使用的原则移除掉。
    (21)multiprocess:是否可以将Activity的实例启动到启动它的那个组件所属的进程中。true为允许,false为不允许。默认值为false。
    (22)noHistory:当Activity不可见时,是否将其从任务栈中移除并finish掉。true移除,activity不会留在任务栈内,所以此时onActivityResult()方法不会被调用。false不移除。默认为false。
    (23)parentActivityName:向上导航跳转到的Activity类名,必须要和目标Activity的name一致。
    (24)permission:对Activity设置权限保护。如果调用方未设置指定权限,则intent不会传递给Activity。
    (25)persistableMode:数据持久化。设置任务栈里的Activity在设备重启的时候是否进行数据的持久化处理。当设备重启后启动对应的Activity时能够对数据进行恢复。
    (26)process:设置运行此Activity的进程名字。
    (27)relinquishTaskIdentity:声明此属性的Activity是否放弃任务标识符而交由其任务栈上面的Activity。
    (28)resizeableActivity:是否支持多窗口展示。API 24引入
    (29)screenOrientation:Activity在设备的显示方向。如果是多屏显示,则会忽略此项。
    (30)stateNotNeeded:Activity在被kill掉的时候是否需要保存相关状态,在重启的时候是否需要回复状态。true不需要,此时在kill掉的时候不会调用onSaveInstanceState() 方法,onCreate()传null值,而不是Bundle。默认值为false。
    (31)supportsPictureInPicture:是否支持画中画。如果resizeableActivity设置为false则此项会被忽略掉。API 24引入。
    (32)theme:Activity的主题设置,如果此项缺省,则继承application的theme。
    (33)uiOptions:API 14引入。为Activity的UI添加额外的操作。
    (34)windowSoftInputMode:Activity 的主窗口与包含屏幕软键盘的窗口的交互方式。

  • activity-alias

    Activity的别名,为目标Activity提供快捷入口

     
        . . .
    
    

    (1)enabled:目标Activity是否可通过别名被系统实例化。默认为true。如果为false,则activity-alias无效。当application的enabled和此项都为true时,才能够对目标activity进行实例化。
    (2)exported:其他APP的组件是否可通过此别名来启动目标Activity。true为可以,false为不可以。如果为false,则只能由其所属的APP或相同User ID的APP启动。
    (3)icon:展示的图标。
    (4)label:展示的名字。
    (5)name:别名的唯一字符串名字,命名风格和Java类名全路径一样,必须唯一。
    (6)permission:通过别名启动目标Activity所需要的权限。
    (7)targetActivity:目标Activity在Manifest中声明的name。

  • meta-data

  以键值对的形式为其父级组件元素提供额外的数据,且其父组件可以包含任意多个meta-data元素。父组件元素包括:。最终meta-data的值都会被封装到Bundle对象放到PackageItemInfo.metaData字段。

(1)name:meta-data的名字,必须具有唯一性。为了确保唯一性,最好用Java风格的规范命名。
(2)value:对应的值。
(3)resource:资源的引用,此处为资源的ID。

  • service

    声明一个服务组件。

    
        . . .
    
    

    (1)description:对service做描述的字符串。
    (2)directBootAware:是否可以在锁屏的时候运行。默认值为false。
    (3)enabled:是否可被系统实例化。
    (4)exported:是否允许其他APP的组件对其进行调用或交互。
    (5)icon:service展示的图标。
    (6)isolatedProcess:如果设置为true,则此服务会运行在一个独立的进程中,此进程与系统的其他进程是分开的并且没有自己的权限。唯一能够与此服务通信的方法是通过服务的API。
    (7)label:展示给用户看的服务名字。不设置的话默认继承application的label。
    (8)name:服务子类全名。
    (9)permission:对service设置的权限保护。如果调用方未设置指定权限,则 startService(), bindService(), 或 stopService()不会起作用。如果此项未设置,则继承application的permission项,如果application也没设置,则Activity无权限。
    (10)process:服务运行所在的进程名,默认为APP运行所在的进程,与包同名。

  • receiver

    声明一个广播接收器(BroadcastReceiver的子类)组件。

    
        . . .
    
    

    (1)directBootAware:是否可以在锁屏的时候运行。默认值为false。
    (2)enabled:是否可被系统实例化。默认为true。
    (3)exported:是否可接收其他APP发送的广播消息。
    (4)icon:展示的图标。
    (5)label:展示给用户看的名字
    (6)name:广播接收器子类的全名。
    (7)permission:设置保护权限。
    (8)process:广播接收器运行所在的进程名,默认为APP运行所在的进程,与包同名。

  • provider

    声明内容提供者(content provider)组件。

    
        . . .
    
    

    (1)name:ContentProvider对应的子类的全名。
    (2)authorities:指定提供给外部访问的URI标识,可以设置多个,用分号隔开。
    (3)enabled:是否可被系统实例化。
    (4)directBootAware:是否可以在锁屏的时候运行。
    (5)exported:是否可被其他APP访问。
    (6)icon:对应展示的图标。
    (7)initOrder:多个ContentProvider在同一个进程实例化的顺序,为整数值,大值会优先进行初始化。
    (8)label:展示给用户看的名字。
    (9)process:设置ContentProvider运行所在的进程名。
    (10)multiprocess:如果APP有多个进程在运行,则是否设置多个ContentProvider的实例,每个实例对应一个进程。
    (11)syncable:是否设置数据同步。
    (12)permission:连接此ContentProvider并进行读写操作所需的权限。
    (13)readPermission:设置客户端连接此ContentProvider进行读操作(查询)所需的权限。
    (14)writePermission:设置客户端连接此ContentProvider进行写操作(查询)所需的权限。
    (15)grantUriPermissions:是否可给平常无权对 Content Provider 数据的访问进行临时授权 ,使之能够对数据进行操作。

  • path-permission

    定义ContentProvider数据子集相关的路径和访问所需权限。

    
    

    (1)path 用来匹配完整的路径,如:content://example.com/a/b/c,这里的path为“/a/b/c”。
    (2)pathPrefix 用来匹配路径的开头部分,拿上面的 Uri 来说,这里将 pathPrefix 的值为“/a”。
    (3)pathPattern:使用通配符的完整路径。
    (4)permission:设置访问所需的权限,读权限和写权限。
    (5)readPermission:读权限。
    (6)writePermissio:写权限。

  • uses-library

    定义APP必须链接的公共库, 本元素把程序包的类装载器中需要包含的库代码通知系统。

    
    

    (1)name:代码库的名字。
    (2)required:设置为true的话,如果系统没有name声明对应的库,则程序不能安装。设置为false,没有name声明对应的包也允许程序安装,单在APP里要做好对缺少声明库的相关处理。

大功告成!

参考文章

Android知识点回顾之Manifest文件——来自掘金的大神,知识点总结真的很到位。学习到了!

你可能感兴趣的:(全面解析:Android之Manifest.xml文件的标签+属性)