了解AndroidManifest.xml清单文件
Android开发基础之了解AndroidManifest.xml清单文件
认识了解AndroidManifest.xml
为了录制视频的时候时间不那么长,所以笔记的话我课后再写吧,大家可以结合笔记来学习练习。
其实在之前我们已经使用过了AndroidManifest.mxl了,还记得在什么时候吗?在我们学习数据持久化存储的时候,我们在清单文件里添加了外置扩展卡的读写权限,如下:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
大家还有印象吗?没印象不关系,今天我们再添加一次嘛,对吧!!
首先Manifest是清单的意思,是送货单的意思。那我们要怎么理解呢?很简单,我们类比就可以了,既然是送货单,它是用于描述所送的货们物的嘛。因些,AndroidManifest.xml是用于描述应用程序的。它描述权限,描述这个应用的四大组件。
权限前面我们已经用到了,同学们不用去记。随着你代码写多了,就就知道什么时候需要获取权限了,写的时候不知道怎么写也没关系,因为会提示你的。这个不需要去记,实在不知道什么时候添加权限,你放心,会报错的嘛!报错会打出来告诉你需要什么权限的,OK!到这里的话,权限就搞定了!
One more thing.还有一点要注意的,就是权限的添加不要放错地方哦!
不要放到application里面去了呢。
好啦,到这里我们权限就搞定了!!
再到application,从上图我们可以看到有一个标签是application,也就是应用的意思。一个应用程序就有一个application,这里的话没有指明注册,默认就有一个application。如果大家要在application的生命周期里头做点什么东西,可以写一个application类,比如说BaseApplication并且继承Application这个类,复写application的生命周期方法,还有一点,就是要在Manifest里进行注册。如下:
先创建一个BaseApplication类:
在xml文件里进行注册,怎么注册呢?很简单,在application的标签属性里添加一个name属性:
好啦,到这里的话,当应用程序启动的时候,就会调用application的生命周期方法onCreate了。
我们继续去application别的属性。
android:allowBackup="true"
这个属性翻译过来就是允许备份的意思,true就是允许,false就是不允许。这里的备份是谁备份呢?
是系统备份呢。它的官方说明是怎么样的呢?
android:allowBackup
Whether to allow the application to participate in the backup and restore infrastructure. If this attribute is set to false, no backup or restore of the application will ever be performed, even by a full-system backup that would otherwise cause all application data to be saved via adb. The default value of this attribute is true.
翻译过来大概是:
是否参与备份以及恢复.如果这个属性设置为false,就不会被备份或者恢复到曾经使用的时候一样,即使是全包备份,也不会把整个应用程序的数据保存到via数据库中.这个属性的默认值是true.
下一个属性是设置应用的图标,这个图标累死于我们的Pc上的桌面图标或者说是快捷启动图标。
android:icon="@mipmap/ic_launcher"
从上面的这个属性值来看,它的名字是ic_launcher,我们可以从Android Studio的左边可以看到,有多个这们的文件ic_launcher.png
它们分别是不同尺寸的设备使用的。Android系统的硬件设备太多了,这不跟iOS一样,三套图片就可以了。而android的话,因为厂商不统一,没有统一的标准,所以的话屏幕的尺寸非常多。
回到我们说的这个图标上,这个图标的名字是可自己定的,对吧!你可以叫logo,也可以叫launcher_icon
直接替换原有的文件,或者修清单文件里的引用名称也可以的。
好的,我们来看下一下属性值:
android:label="@string/app_name"
这个是Label,是吧!label是什么意思呢?标记,标签的意思。学习xml就知道了!
这个Label属性在这里有什么用呢?它也就是我们看到的应用名称啦!
在那时修改?它其实在资源res文件下面的strings.xml文件里。
直接修改上面的app_name的内容即可。
这里面要注意的是:activity标签也可以配置label标签,假设在主程序入口的activity里配置,解释和application的不一样,那么也会显示activity的是一样的。这种配置信息的读取,是后来的复盖前面的内容。其实还有,嘻嘻!后面讲到多个activity入口再说。
下面这个属性是支持从右到左
android:supportsRtl="true"
可能做了两个开发的同学也不知道这个什么意思,Rtl其实是右到左的意思。这个属性很少用,但是我在做手表系统开发的时候用到过。什么意思呢?
先看这里:
在开发者选项里头,有这么一个选项:强制使用从右到左的布局方向。下面的summary说:强制将所有语言区域的屏幕布局方向改成从右到左。
第一种情况:也就是默认的状态,这个支持从右到左的值为true。
第二种情况:把属性的值设置为true并且,设置开发者选项里强制布局从右到左:
android:supportsRtl="true"
这样子设置的话,我们可以看到:
因为是允许的,是吧。所以真的是从右到左布局了。
第三种情况,我们把属性设置为false,一样的打开这个开发者选项里强制布局从右到左:
android:supportsRtl="false"
这个时候,它是这样子的,也就是跟我们默认的样子是一样的:
所以,可以通过设置这个属性值,来控制是否允许强制从右到左布局。我做手表是因为手表是圆的,你正看和反着看都行,对吧!!!
好啦,application还有一个常用的标签:
android:theme="@style/AppTheme"
这个标签用于控制样式,它在那里呢?在res文件夹下面的styles.xml文件里:
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.NoActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
</resources>
这里可以看到parent这个单词,它的意思就是继承自Theme.AppCompat.NoActionBar,这javaWeb开发的struts的配置是一样的,都具有继承性,跟我们的java也是一样和道理。
就一个application竟然写了这么多东西,你以为完事了吗?其实我还没有写activity的配置呢!
这里面把application的属性列出来,给大家看看就OK了,不用去记的。
<application android:allowTaskReparenting=["true" | "false"]
android:allowBackup=["true" | "false"]
android:allowClearUserData=["true" | "false"]
android:backupAgent="string"
android:backupInForeground=["true" | "false"]
android:banner="drawable resource"
android:debuggable=["true" | "false"]
android:description="string resource"
android:directBootAware=["true" | "false"]
android:enabled=["true" | "false"]
android:extractNativeLibs=["true" | "false"]
android:fullBackupContent="string"
android:fullBackupOnly=["true" | "false"]
android:hasCode=["true" | "false"]
android:hardwareAccelerated=["true" | "false"]
android:icon="drawable resource"
android:isGame=["true" | "false"]
android:killAfterRestore=["true" | "false"]
android:largeHeap=["true" | "false"]
android:label="string resource"
android:logo="drawable resource"
android:manageSpaceActivity="string"
android:name="string"
android:networkSecurityConfig="xml resource"
android:permission="string"
android:persistent=["true" | "false"]
android:process="string"
android:restoreAnyVersion=["true" | "false"]
android:requiredAccountType="string"
android:resizeableActivity=["true" | "false"]
android:restrictedAccountType="string"
android:supportsRtl=["true" | "false"]
android:taskAffinity="string"
android:testOnly=["true" | "false"]
android:theme="resource or theme"
android:uiOptions=["none" | "splitActionBarWhenNarrow"]
android:usesCleartextTraffic=["true" | "false"]
android:vmSafeMode=["true" | "false"] >
. . .
</application
接下来,我们简单地看看activity标签吧!
<activity
android:name=".MainActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
这是比较常见的配置方式,这里的name和application里的name是一样的。都是用于配置目标的类。四大组件的静态注册,name都是指要注册的类。
这里也可以声明label的值。因为接下来我们的intent-filter,也就是意图过滤器,声明的是主入口,所以这里这个label值就会成为了这个入口的名称,当然啦,一个应用程序可以有多个入口,详情请看视频。
主入口的默认写法:
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
单词,相信都能看懂是什么意思的,我们后面的课程中讲解activity的时候才进行详细讲解意图过滤。
在线课程地址:
https://www.sunofbeach.net/c/1443881236287311874