AndroidManifest.xml
是 Android开发中最经常使用的配置文件,以前一直没有认真了解过,如今来对它的配置作个总结。html
每一个应用项目必须在项目源设置的根目录中加入 AndroidManifest.xml
文件(且必须使用此名称)。 AndroidManifest.xml
会向 Android 构建工具、Android 操做系统等描述应用的基本信息。java
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="string" android:sharedUserId="string" android:sharedUserLabel="string resource" android:versionCode="integer" android:versionName="string" android:installLocation=["auto" | "internalOnly" | "preferExternal"] >
. . .
</manifest>
复制代码
manifest
是AndroidManifest.xml
文件的根元素。它必须包含<application>
元素并指定xmlns:android和package属性。android
定义Android命名空间。此属性应始终设置为“http://schemas.android.com/apk/res/android”
数据库
在将应用构建为最终的应用软件包 (APK) 时,Android 构建工具会使用 package 属性完成两件事情:app
它会将此名称用做应用所生成 R.java 类(用于访问应用资源)的命名空间。ide
它会使用此名称解析清单文件中声明的任何相关类名称。 例如:将 <activity android:name=".MainActivity">
的 Activity 解析为 com.example.myapp.MainActivity
工具
所以,AndroidManifest.xml
中package
属性中的名称应始终与项目中保存 Activity 和其余应用代码的基础软件包的名称相匹配。 固然,能够在项目中加入其余子软件包,但此类文件必须使用 package
属性的命名空间导入 R.java
类。post
APK 编译完成后,package 属性还可表示应用的通用惟一应用 ID。 当构建工具根据 package 名称执行上述任务后,它们会将 package 值替换为项目 build.gradle 文件(用于 Android Studio 项目)中赋予 applicationId 属性的值。清单中的 package 名称与 build.gradle 文件中 applicationId 的区别能够看《Gradle for Android》核心总结(一)Gradle文件gradle
将与其余应用程序共享的Linux用户标识的名称。 默认状况下,Android会为每一个应用分配本身惟一的用户ID。 可是,若是此属性设置为两个或多个应用程序的相同值,则它们将共享相同的ID - 前提是它们的证书集相同。 具备相同用户ID的应用程序能够访问彼此的数据,而且若是须要,能够在同一进程中运行。ui
共享用户标识.注意:必须将标签设置为对字符串资源的引用; 它不能是原始字符串。 此属性是在API级别3中引入的。仅当还设置了sharedUserId属性时才有意义。
内部版本号。 此数字(只能是正整数)仅用于肯定一个版本是否比另外一个版本更新,更高的数字表示更新的版本。 这不是向用户显示的版本号;
给用户看的版本号
设置应用默认的安装位置,有三个值能够选择:internalOnly
、auto
、preferExternal
.
参数 | 意义 |
---|---|
internalOnly | 该应用必须仅安装在内部设备存储上。 若是设置了此选项,则永远不会在外部存储上安装该应用程序。 若是内部存储空间已满,则系统将不会安装该应用程序。 若是您没有定义android:installLocation,这也是默认行为 |
auto | 该应用程序可能安装在外部存储上,但系统默认会在内部存储上安装该应用程序。 若是内部存储已满,则系统会将其安装在外部存储上。 安装后,用户能够经过系统设置将应用程序移动到内部或外部存储 |
preferExternal | 该应用程序更喜欢安装在外部存储(SD卡)上。 没法保证系统会遵照此请求。 若是外部媒体不可用或已满,则应用程序可能会安装在内部存储上。 安装后,用户能够经过系统设置将应用程序移动到内部或外部存储。 |
在外部存储上安装应用程序时:.apk文件将保存到外部存储,但任何应用程序数据(如数据库)仍保存在内部设备内存中。 保存.apk文件的容器使用密钥加密,该密钥容许应用程序仅在安装它的设备上运行。 (用户没法将SD卡传输到其余设备并使用卡上安装的应用程序。)可是,多个SD卡能够与同一设备一块儿使用。 根据用户的请求,能够将应用程序移动到内部存储。
更多信息能够见android官方教程
指定用户必须授予的系统权限,以便应用正常运行
<uses-permission android:name="string" android:maxSdkVersion="integer" />
复制代码
要申请权限的名称。
此权限应授予应用的最高 API 级别。若是从某个 API 级别开始再也不须要应用所需的权限,则设置此属性很是有用。 例如,从 Android 4.4(API 级别 19)开始,应用在外部存储空间写入其特定目录(getExternalFilesDir() 提供的目录)时再也不须要请求 WRITE_EXTERNAL_STORAGE 权限。但 API 级别 18 和更低版本须要此权限。所以,您可使用以下声明,声明只有 API 级别 18 及之前版本才须要此权限:
这样,从 API 级别 19 开始,系统将再也不向您的应用授予 WRITE_EXTERNAL_STORAGE 权限。
此属性为 API 级别 19 中的新增属性。
权限分为两种:普通权限和系统权限。对于普通权限,只要在AndroidManifest.xml申明权限就行(android 6以上一些须要动态申请),系统权限有
WRITE_SETTINGS(修改系统设置)
、SYSTEM_ALERT_WINDOW(设置悬浮窗)
指明应用须要特定权限,但仅当应用在 Android 6.0(API 级别 23)或更高版本的设备上安装时才须要。若是设备运行的是 API 级别 22 或更低版本,则应用没有指定的权限。 当您更新应用以包含须要其余权限的新功能时,此元素颇有用。若是用户在运行 API 级别 22 或更低版本的设备更新应用,系统在安装时会提示用户授予在该更新中声明的全部新权限。若是某个新功能可有可无,您可能想同时在这些设备上停用该功能,以便用户不须要授予额外权限便可更新应用。若是使用 元素而非 ,则仅当应用在支持运行时权限模式(用户在应用运行时向其授予权限)的平台上运行时才可请求权限。
属性值和uses-permission
相同
声明应用实现功能所需的条件,例如摄像机应用须要摄像头。详情见文档
用来自定义权限,示例以下:
在AndroidManifest.xml文件中声明本身的权限
<permission android:name="com.demo.mytest" //自定义权限名 android:label="@string/my_lable" //设置权限的标签 android:description="@string/my_describetion" //设置权限的描述 android:protectionLevel="dangerous" //设置权限的类型,有许多种(normal普通权限 dangerous危险权限 signature 根据签名来决定是否赞成) android:permissionGroup=""//设置权限组,权限组也能够自定义 android:icon=""//设置权限的图标,在申请危险权限,请求用户赞成的的时候才会展现 />
复制代码
资源文件
<string name="my_lable">个人自定义权限</string>
<string name="my_describetion">没啥用</string>
复制代码
注意必定要用资源文件来引用字符串,不能直接设置值,好比android:label="个人自定义权限",否则会报错
<activity android:name=".MyPermissionTest.PermissionTestActivity" android:permission="com.demo.mytest" //这里设置访问权限 android:exported="true" //true表示外面的应用能够启动这个activity >
<intent-filter>
<action android:name="callmenow"/> //用于其余的应用经过隐式Intent来启动这个Activity
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
复制代码
在< service>< provider>< receiver>中也是同样的
1.在AndroidManifest.xml中加入权限<uses-permission android:name="com.demo.mytest"/>
2.若是这个权限是危险权限,则要询问用户是否授予权限(与普通的权限申请同样),若是是普通权限,则只要在AndroidManifest.xml中申明便可
if (ContextCompat.checkSelfPermission(MainActivity.this,"com.demo.test")== PackageManager.PERMISSION_DENIED){
ActivityCompat.requestPermissions(MainActivity.this,new String[]{"com.demo.mytest"},1);
}else{
test();
}
private void test(){
Intent intent1=new Intent();
intent1.setAction("callmenow");
startActivity(intent1);
}
复制代码
效果以下图: