AndroidManifest.xml配置文件选项详解

本文详细解析了AndroidManifest.xml中关键属性的定义与用法,包括allowTaskReparenting、alwaysRetainTaskState等,有助于开发者更好地理解和配置Android应用程序。

AndroidManifest.xml下的一些属性定义和用法:

----------------------------------------------------------------------------------------------------------------------------------

android:allowTaskReparenting        

 

         用法<application android:allowTaskReparenting="true/false"></application>

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

用来标记Activity能否从启动的Task移动到有着affinity的Task(当这个Task进入到前台时)——“true”,表示能移动,“false”,表示它必须呆在启动时呆在的那个Task里。

        如果这个特性没有被设定,设定到<application>元素上的allowTaskReparenting特性的值会应用到Activity上。默认值为“false”。

       一般来说,当Activity启动后,它就与启动它的Task关联,并且在那里耗尽它的整个生命周期。当当前的Task不再显示时,你可以使用这个特性来强制Activity移动到有着affinity的Task中。典型用法是:把一个应用程序的Activity移到另一个应用程序的主Task中。

       例如,如果e-mail中包含一个web页的链接,点击它就会启动一个Activity来显示这个页面。这个Activity是由Browser应用程序定义的,但是,现在它作为e-mail Task的一部分。如果它重新宿主到Browser Task里,当Browser下一次进入到前台时,它就能被看见,并且,当e-mail Task再次进入前台时,就看不到它了。

       Actvity的affinity是由taskAffinity特性定义的。Task的affinity是通过读取根Activity的affinity 决定。因此,根据定义,根Activity总是位于相同affinity的Task里。由于启动模式为“singleTask”和 “singleInstance”的Activity只能位于Task的底部,因此,重新宿主只能限于“standard”和“singleTop”模式。

----------------------------------------------------------------------------------------------------------------------------------

android:alwaysRetainTaskState

 

       用法<activity android:alwaysRetainTaskState="true/false"></activity>

        用来标记Activity所在的Task的状态是否总是由系统来保持——“true”,表示总是;“false”,表示在某种情形下允许系统恢复Task 到它的初始化状态。默认值是“false”。这个特性只针对Task的根Activity有意义;对其它Activity来说,忽略之。

        一般来说,特定的情形如当用户从主画面重新选择这个Task时,系统会对这个Task进行清理(从stack中删除位于根Activity之上的所有Activivity)。典型的情况,当用户有一段时间没有访问这个Task时也会这么做,例如30分钟。

       然而,当这个特性设为“true”时,用户总是能回到这个Task的最新状态,无论他们是如何启动的。这非常有用,例如,像Browser应用程序,这里有很多的状态(例如多个打开的Tab),用户不想丢失这些状态。

----------------------------------------------------------------------------------------------------------------------------------

android:clearTaskOnLanunch

 

         用法<activity android:clearTaskOnLanunch=”true/false”></activity>

         用来标记是否从Task中清除所有的Activity,除了根Activity外(每当从主画面重新启动时)——“true”,表示总是清除至它的根 Activity,“false”表示不。默认值是“false”。这个特性只对启动一个新的Task的Activity(根Activity)有意义; 对Task中其它的Activity忽略。

         当这个值为“true”,每次用户重新启动这个Task时,都会进入到它的根Activity中,不管这个Task最后在做些什么,也不管用户是使用 BACK还是HOME离开的。当这个值为“false”时,可能会在一些情形下(参考alwaysRetainTaskState特性)清除Task的 Activity,但不总是。

         假设,某人从主画面启动了Activity P,并从那里迁移至Activity Q。接下来用户按下HOME,然后返回Activity P。一般,用户可能见到的是Activity Q,因为它是P的Task中最后工作的内容。然而,如果P设定这个特性为“true”,当用户按下HOME并使这个Task再次进入前台时,其上的所有的 Activity(在这里是Q)都将被清除。因此,当返回到这个Task时,用户只能看到P。

         如果这个特性和allowTaskReparenting都设定为“true”,那些能重新宿主的Activity会移动到共享affinity的Task中;剩下的Activity都将被抛弃,如上所述。

-----------------------------------------------------------------------------------------------------------------------------------

android:configChanges

 

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

         举例:在按下power键时,直接在应用程序里onPause处理就好。当app是竖屏时,这样处理没问题。但是当app是横屏时,按下power键,app会强制回到竖屏,并且会重新调用activity的onCreate。很多时候这不是预期结果,所以就会用到android:configChanges。

         在配置文件里设置android:configChanges=”keyboardHidden|orientation”,这样在屏幕方向改变的时候就不会重新调用activity的onCreate()方法,而是调用onConfigurationChanged(),然后在activity里面重在下。

@Override

public void onConfigurationChanged(Configuration newConfig){

         super.onConfigurationChanged(newConfig);

         if(newConfig.orientation==Configuration.ORIENTATION_LANDSCAPE){

                   //横向

         }else{

                   //竖向

         }

}

-----------------------------------------------------------------------------------------------------------------------------------

android:enabled

 

         activity 是否可以被实例化

         用法:<activity android:enabled="true"></activity>

-----------------------------------------------------------------------------------------------------------------------------------

android:excludeFromRecents

 

         是否可被显示在最近打开的activity列表里

         用法:<activity android:excludeFromRecents="true"></activity>

----------------------------------------------------------------------------------------------------------------------------------

android:exported

 

         是否允许activity被其它程序调用

----------------------------------------------------------------------------------------------------------------------------------

android:finishOnTaskLaunch

 

         用来标记当用户再次启动它的Task(在主画面选择这个Task)时已经存在的Activity实例是否要关闭(结束)——“true”,表示应该关闭,“false”表示不关闭。默认值是“false”。

         如果这个特性和allowTaskReparenting都设定为“true”,这个特性胜出。Activity的affinity忽略。这个 Activity不会重新宿主,但是会销毁。

----------------------------------------------------------------------------------------------------------------------------------

android.icon

        

         用法:<application android:icon="@drawable/xx_icon"></application>,加在应用程序图标

----------------------------------------------------------------------------------------------------------------------------------

android:label

 

         定义了每个title栏的名称,但是优先级低于activity中的setTitle()

---------------------------------------------------------------------------------------------------------------------------------

android:launchMode

 

         用于指示Activity如何启动。这里有四种模式,与Intent对象中的Activity Flags(FLAG_ACTIVITY_*变量)共同作用,来决定Activity如何启动来处理Intent。它们是:

          "standard"

          "singleTop"

          "singleTask"

          "singleInstance"

          默认模式是“standard”。

         “standard”和“singleTop”为第一组,“singleTask”和“singleInstance”为第二组。

         第一组可以被实例化很多次。这些实例可以属于任何task并且可以位于activity stack的任何位置。典型的情况是,它们会进入调用startActivity()的Task(除非Intent对象包含 FLAG_ACTIVITY_NEW_TASK标志,在这种情况下会选择一个不同的Task——参考taskAffinity特性)。

--------------------------------------------------------------------------------------------------------------------------------

 

android:multiprocess

允许多进程

--------------------------------------------------------------------------------------------------------------------------------

android:name

 

activity的类名, 必须指定

 

-------------------------------------------------------------------------------------------------------------------------------

android:onHistory

是否需要移除这个activity当用户切换到其他屏幕时。 这个属性是 API level 3 中引入的

-------------------------------------------------------------------------------------------------------------------------------

 

android:permission

-------------------------------------------------------------------------------------------------------------------------------

android:process

一个activity运行时所在的进程名,所有程序组件运行在应用程序默认的进程中,这个进程名跟应用程序的包名一致。<application>中的元素process属性能够为所有组件设定一个新的默认值。但是任何组件都可以覆盖这个默认值,允许你将你的程序放在多进程中运行。 如果这个属性被分配的名字以:开头,当这个activity运行时, 一个新的专属于这个程序的进程将会被创建。如果这个进程名以小写字母开头,这个activity将会运行在全局的进程中,被它的许可所提供。

--------------------------------------------------------------------------------------------------------------------------------

 

android:screenOrientation

 

activity显示的模式, "unspecified" 默认值 "landscape" 风景画模式,宽度比高度大一些 "portrait" 肖像模式, 高度比宽度大。 "user" 用户的设置 "behind" "sensor" "nosensor"

 

---------------------------------------------------------------------------------------------------------------------------------

 

android:stateNotNeeded

 

是否 activity被销毁和成功重启并不保存状态

 

----------------------------------------------------------------------------------------------------------------------------------

 

android:taskAffinity

 

activity的亲属关系, 默认情况同一个应用程序下的activity有相同的关系

 

--------------------------------------------------------------------------------------------------------------------------------

 

android:theme

 

activity的样式主题, 如果没有设置,则activity的主题样式从属于应用程序, 参见<application>元素的theme属性

---------------------------------------------------------------------------------------------------------------------------------

 

android:windowSoftInputMode

 

activity主窗口与软键盘的交互模式, 自从API level 3 被引入

 

原文地址:http://www.cnblogs.com/tt_mc/archive/2010/10/27/1862915.html

<think>我们正在处理用户的问题:理解Android构建配置文件和清单件的区别,特别是android.bp和AndroidManifest.xml的区别。根据用户的问题,我们需要明确两个件的不同作用和定位。首先,我们参考了站内引用[^1]的内容,它主要介绍了Android.bp件在系统ROM定制化开发中的使用,特别是在内置app、so、aar、jar等件时的用法。但用户的问题是关于android.bp和AndroidManifest.xml的区别,因此我们需要从功能、用途和语法等方面进行区分。1.Android.bp件:-它是Android构建系统(Soong)使用的构建配置文件,用于替代之前的Android.mk件。-它主要用于定义模块(如app、库、二进制件等)的构建规则,包括编译依赖、源码列表、输出目标等。-例如,在Android.bp中,你可以定义一个Android应用模块,指定其源码、资源、依赖库等,构建系统会根据这些信息编译生成APK。2.AndroidManifest.xml件:-它是每个Android应用都必须包含的配置文件,用于描述应用的基本信息,如包名、组件(Activity、Service等)、权限、最低API级别等。-它不参与构建过程的配置(如编译选项、依赖关系等),而是描述应用运行时的行为和特性。因此,两者的主要区别在于:- Android.bp是构建阶段的配置文件,用于指导如何构建应用(编译和打包)。- AndroidManifest.xml是应用运行时的清单件,用于告知Android系统关于应用的结构和元数据。为了更清晰地说明,我们可以举一个例子:-在Android.bp中,你可能会这样定义一个应用模块:android_app {name: "MyApp",srcs: ["src/**/*.java"],resource_dirs: ["res"],manifest: "AndroidManifest.xml",//这里指向清单件static_libs: ["some_library"],}-而在AndroidManifest.xml中,你定义应用的组件和权限:<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.myapp"><application...><activity android:name=".MainActivity" ...>...</activity></application></manifest>总结:Android.bp是构建系统的输入,告诉构建系统如何构建你的应用;而AndroidManifest.xml是应用的一部分,告诉Android操作系统如何运行你的应用。根据用户的问题,我们还需要生成相关问题。注意:回答中引用的段落末尾自然地添加引用标识。我们参考了站内引用[^1],但引用内容主要是关于Android.bp的用法,对于AndroidManifest.xml并没有提及,因此我们主要基于Android开发的基本知识进行回答。生成的相关问题:1. Android构建系统(如Soong)是如何处理Android.bp件的?2.AndroidManifest.xml件中必须包含哪些元素?3.Android应用开发中,除了Android.bp和AndroidManifest.xml,还有哪些重要的配置文件?注意:用户的问题中引用了[^1],但该引用主要讨论Android.bp,因此我们在回答中如果需要引用该内容,可以标注[^1]。但我们的回答中关于Android.bp的部分可以参考该引用,而关于AndroidManifest.xml的部分则不需要引用。下面组织回答:</think>### Android.bp 与 AndroidManifest.xml 的区别 在 Android 开发中,`Android.bp` 和 `AndroidManifest.xml` 是两种完全不同的配置文件,分别作用于**构建阶段**和**运行时**。以下是核心区别: | **特性** | **Android.bp** | **AndroidManifest.xml** | |------------------|---------------------------------------------|---------------------------------------------| | **用途** | 构建系统的配置文件 | 应用运行时的清单件 | | **作用阶段** | 编译和构建阶段 | 应用安装和运行时 | | **语法** | Blueprint 语言(类似 JSON) | XML 格式 | | **核心功能** | 定义模块类型(如 app、库)、依赖、编译参数 | 声明应用组件(Activity 等)、权限、包信息 | | **修改影响** | 影响构建输出(如 APK 生成) | 影响应用行为(如权限申请、组件注册) | | **位置** | 源码目录(如 `device/` 或 `packages/`) | 应用模块的根目录(如 `app/src/main/`) | --- ### 详细说明 #### 1. **Android.bp(构建配置文件)** - **作用**:指导构建系统(Soong)如何编译代码和资源,生成最终输出(如 APK、AAR、JAR 等)。 - **典型内容**: ```json android_app { name: "MyApp", // 模块名称 srcs: ["src/**/*.java"], // 源码路径 manifest: "AndroidManifest.xml", // 指向清单件 static_libs: ["libutils"], // 依赖的静态库 certificate: "platform", // 签名证书 } ``` - **关键点**: - 用于声明**模块类型**(如 `android_app`、`java_library`)。 - 管理**编译依赖**(如静态库、动态库)。 - 控制**构建行为**(如优化选项、签名配置)[^1]。 #### 2. **AndroidManifest.xml(应用清单件)** - **作用**:向 Android 系统声明应用的基本信息、组件和权限要求。 - **典型内容**: ```xml <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.myapp"> <!-- 包名 --> <uses-permission android:name="android.permission.CAMERA"/> <!-- 权限 --> <application android:icon="@mipmap/ic_launcher" android:label="@string/app_name"> <activity android:name=".MainActivity"> <!-- 注册Activity --> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> ``` - **关键点**: - 定义**应用标识**(包名、版本号)。 - 注册**四大组件**(Activity、Service 等)。 - 声明**权限需求**(如相机、定位)。 - 指定**系统要求**(如最低 API 级别)。 --- ### 协作关系 二者在构建过程中协同工作: 1. `Android.bp` 中通过 `manifest` 字段指向 `AndroidManifest.xml`: ```json android_app { manifest: "src/main/AndroidManifest.xml", // 显式引用清单... } ``` 2. 构建时,构建系统会读取 `AndroidManifest.xml` 中的包名、权限等信息,并将其打包到最终 APK 中。 3. 安装 APK 时,系统解析 `AndroidManifest.xml` 来注册组件和权限。 --- ### 简单总结 - **Android.bp** = **“如何构建应用”**(编译规则、依赖管理)。 - **AndroidManifest.xml** = **“应用是什么”**(组件、权限、元数据)。 > 例如:`Android.bp` 指定了构建 APK 所需的代码和依赖库,而 `AndroidManifest.xml` 则告诉系统该 APK 包含一个名为 `MainActivity` 的界面,并需要相机权限[^1]。 --- ### 相关问题 1.Android 构建系统中,`Android.mk` 和 `Android.bp` 有何异同? 2. 如何通过 `AndroidManifest.xml` 声明应用所需的最低 SDK 版本? 3. 构建系统如何处理 `Android.bp` 中的模块依赖关系? 4. `AndroidManifest.xml` 中哪些配置会影响应用的安全行为? [^1]: Android.bp详解,以及内置app编写Android.bp件。在11.0的系统rom定制化开发中,在内置app的时候都是常用的用法,用Android.mk的常用,但是某些时候,会使用Android.bp的方式来内置app。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值