家资是何物,积帙列梁梠。这篇文章主要讲述Android Studio中的AndroidManifest.xml文件分析相关的知识,希望能为你提供帮助。
一、关于androidManifest.xmlAndroidManifest.xml清单文件是每个Android程序中必须的文件,它是整个Android程序的全局描述文件,除了能声明程序中的Activities,Content Providers,Services,和Intent Receivers,还能指定应用的名称、使用的图标、包含的组件以及permissions和instrumentation(安全控制和测试)。
二、Hello World工程中的清单文件分析
< ?xml version="1.0" encoding="utf-8"?> < 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>
各节点解释(顺序从上到下):
- xmlns:android:定义android命名空间,这样使得Android中各种标准属性能在文件中使用,提供了大部分元素中的数据。
- package:指定本应用内java主程序包的包名,它也是一个应用进程的默认名称。
- application:一个AndroidManifest.xml中必须含有一个Application标签,这个标签声明了每一个应用程序的组件及其属性(如icon、label、permission等)。
- allowBackup:当allowBackup标志为true时,用户即可通过adb backup和adb restore来进行对应用数据的备份和恢复,这可能会带来一定的安全风险。
- icon:这个很简单,就是声明整个APP的图标,图片一般都放在drawable文件夹下。
- label:声明整个APP的名字,字符串常量一般都放在values文件夹下的strings.xml里。
- supportsRtl:支持从右往左显示的布局(正常布局在镜子里面看到的左右对调过的样子)。
- theme:是一个资源的风格,它定义了一个默认的主题风格给所有的activity,当然也可以在自己的theme里面去设置它,有点类似style。
- activity:定义APP中的一个组件Activity。
- name:该Activity的名字。
- intent-filter:广播过滤器,后续会讲到。
- < action android:name:指定程序入口Activity,在这里是MainActivity。
- < category android:name:指定当前动作(Action)被执行的环境。这里的CATEGORY_LAUNCHER决定应用程序是否显示在程序列表里。
- 其余的:对应于各个开始节点的结束节点。
三、通用的清单文件结构以及各个节点的详细介绍 通用清单文件结构:
< ?xmlversion="1.0"encoding="utf-8"?> < 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>
各个节点详细解释: 1、< Manifest>
< manifestxmlns:android="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"] > < /manifest>
- xmlns:android
- package
- sharedUserId
- sharedUserLabel
- versionCode
- versionName
- installLocation
- 选择preferExternal
系统会优先考虑将APK安装到SD卡上(当然最终用户可以选择为内部ROM存储上,如果SD存储已满,也会安装到内部存储上)。 - 选择auto
系统将会根据存储空间自己去适应。 - 选择internalOnly
是指必须安装到内部才能运行。
2、< Application>
< applicationandroid:allowClearUserData=https://www.songbingjia.com/android/["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>
- android:allowClearUserData(‘true‘ or ‘false‘)
- android:allowTaskReparenting(‘true‘ or ‘false‘)
- android:backupAgent
- android:debuggable
Device XXX requires that applications explicitely declare themselves as debuggable in their manifest.
Application XXX does not have the attribute ‘debuggable‘ set to TRUE in its manifest and cannot be debugged.
- android:description / android:label
label应当尽量简短,只需要告知用户该许可是在保护什么功能就行。而description可以用于具体描述获取该许可的程序可以做哪些事情,实际上让用户可以知道如果他们同意程序获取该权限的话,该程序可以做什么。我们通常用两句话来描述许可,第一句描述该许可,第二句警告用户如果批准该权限会可能有什么不好的事情发生。
- android:enabled
- android:hasCode(‘true‘ or ‘false‘)
比如Activity类,此类使用了AliasActivity类,当然这是个罕见的现象(在Android2.3可以用标准C来开发应用程序,可在androidManifest.xml中将此属性设置为false,因为这个APP本身已经不含有任何的JAVA代码了)
- android:icon
- android:killAfterRestore
- android:manageSpaceActivity
- android:name
- android:permission
- android:presistent
- android:process
- android:restoreAnyVersion
- android:taskAffinity
- android:theme
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>
- android:alwaysRetainTaskState
比如一个浏览器拥有很多状态(当打开了多个TAB的时候),用户并不希望丢失这些状态时,此时可将此属性设置为true。
- android:clearTaskOnLaunch
- android:configChanges
比如 "locale | navigation | orientation",这个主要用来看手机方向改变的。 Android手机在旋转后,layout会重新布局,如何做到呢?正常情况下, 如果手机旋转了,当前Activity会被杀掉,然后根据方向重新加载这个Activity,就会从onCreate开始重新加载;如果你设置了这个选项,当手机旋转后,当前Activity之后会调用onConfigurationChanged() 方法而不跑onCreate()方法等。
- android:excludeFromRecents
- android:finishOnTaskLaunch
如果这个属性和allowTaskReparenting都是true,那么这个属性就是王牌,Activity的亲和力将被忽略,该Activity已经被摧毁并非re-parented。
- android:launchMode
- android:multiprocess
- android:noHistory
- android:screenOrientation
landscape:横屏模式,宽度比高度大;
portrait:竖屏模式, 高度比宽度大;
user模式:用户当前首选的方向;
behind模式:和该Activity下面的那个Activity的方向一致(在Activity堆栈中的);
sensor模式:有物理的感应器来决定;
nosensor模式:忽略物理感应器,这样就不会随着用户旋转设备而更改了。
- android:stateNotNeeded
【Android Studio中的AndroidManifest.xml文件分析】Activity被销毁或者成功重启时是否保存状态。
- android:windowSoftInputMode
这个属性能影响两件事情:
1.当有焦点产生时,软键盘是隐藏还是显示
2.是否减少活动主窗口大小以便腾出空间放软键盘
各值的含义:
- stateUnspecified:软键盘的状态并没有指定,系统将选择一个合适的状态或依赖于主题的设置
- stateUnchanged:当这个activity出现时,软键盘将一直保持在上一个activity里的状态,无论是隐藏还是显示
- stateHidden:用户选择activity时,软键盘总是被隐藏
- stateAlwaysHidden:当该Activity主窗口获取焦点时,软键盘也总是被隐藏的
- stateVisible:软键盘通常是可见的
- stateAlwaysVisible:用户选择activity时,软键盘总是显示的状态
- adjustUnspecified:默认设置,通常由系统自行决定是隐藏还是显示
- adjustResize:该Activity总是调整屏幕的大小以便留出软键盘的空间
- adjustPan:当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分
4、< intent-filter>
< intent-filterandroid:icon="drawable resource" android:label="string resource" android:priority="integer" > < action /> < category /> < data /> < /intent-filter>
- priority属性
Intent filter内会设定的资料包括action、data与category三种,也就是说filter只会与intent里的这三种资料作对比动作。
- action属性
- category属性
- data属性
< dataandroid:host="string" android:mimeType="string" android:path="string" android:pathPattern="string" android:pathPrefix="string" android:port="string" android:scheme="string" />
- 每个<
data>
元素指定一个URI和数据类型(MIME类型)。它的四个属性scheme、host、port、path对应于URI的每个部分: scheme://host:port/path。scheme的值一般为"http",host为包名,port为端口号,path为具体地址。
其中host和port合起来构成URI的凭据(authority),如果host没有指定,则port也会被忽略。要让authority有意义,scheme也必须要指定。要让path有意义,scheme+authority也必须要指定。 - mimeType(指定数据类型),若mimeType为‘Image‘,则会从Content Provider的指定地址中获取image类型的数据。还有“ video” 等,若设置为video/mp4,则表示在指定地址中获取mp4格式的video文件
- 而pathPattern和PathPrefix主要是为了格式化path所使用的
转自:https://www.jianshu.com/p/1a8df0a8707c
推荐阅读
- 继承Activity与AppcompatActivity的区别
- Android Studio 3.0下创建menu布局文件的图例
- Ubuntu利用ROS搭建手机移动网络摄像头(Android)
- application和yml的区分
- .net平台性能很不错的轻型ORM类Dapper
- 通用 mapper的简单使用
- 极光推送-java消息推送app
- CSAPP第八章
- CentOS7根目录磁盘扩容(/dev/mapper/centos-root 空间不足)