Android 06 AndroidManifest 详解复习

大体结构如下代码:

<manifest>  
<!-- 基本配置 -->  
<uses-permission />  
<permission />  
<permission-tree />  
<permission-group />  
<instrumentation />  
<uses-sdk />  
<uses-configuration />  
<uses-feature />  
<supports-screens />  
<compatible-screens />  
<supports-gl-texture />  
  
<!-- 应用配置 -->  
<application>  
      
    <!-- Activity 配置 -->  
    <activity>  
        <intent-filter>  
            <action />  
            <category />  
            <data />  
        </intent-filter>  
        <meta-data />  
    </activity>  
      
    <activity-alias>  
        <intent-filter> . . . </intent-filter>  
        <meta-data />  
    </activity-alias>  
      
    <!-- Service 配置 -->  
    <service>  
        <intent-filter> . . . </intent-filter>  
        <meta-data/>  
    </service>  
      
    <!-- Receiver 配置 -->  
    <receiver>  
        <intent-filter> . . . </intent-filter>  
        <meta-data />  
    </receiver>  
      
    <!-- Provider 配置 -->  
    <provider>  
        <grant-uri-permission />  
        <meta-data />  
    </provider>  
      
    <!-- 所需类库配置 -->  
    <uses-library />  

</application>  
 </manifest>  

就常用的几个拿来分析,
其中 <uses-permission>标签为权限,用的多了
<uses-sdk>用于指定Android应用中所需要使用的SDK的版本。
<uses-configuration>与<uses-feature>这两个标签都是用于描述应用所需要的硬件和软件特性,以便防止应用在没有这些特性的设备上安装。
第二层(<Application>):属性一个AndroidManifest.xml中必须含有一个Application标签,这个标签声明了每一个应用程序的组件及其属性(如icon,label,permission等)。
其中比较重要的

<application  android:allowClearUserData=["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:name为应用程序所实现的Application子类的全名。当应用程序进程开始时,该类在所有应用程序组件之前被实例化。
比如说自定义application用来捕获全局异常必须在这里注册。

android:presistent该应用程序是否应该在任何时候都保持运行状态,默认为false,还是改成true,保证长期执行吧。

重点是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>

1、android:alwaysRetainTaskState
是否保留状态不变, 比如切换回home, 再从新打开,activity处于最后的状态。比如一个浏览器拥有很多状态(当打开了多个TAB的时候),用户并不希望丢失这些状态时,此时可将此属性设置为true
2、android:clearTaskOnLaunch比如 P 是 activity, Q 是被P 触发的 activity, 然后返回Home, 重新启动 P,是否显示 Q
3、android:configChanges
当配置list发生修改时, 是否调用 onConfigurationChanged() 方法 比如 "locale|navigation|orientation".这个我用过,主要用来看手机方向改变的. android手机在旋转后,layout会重新布局, 如何做到呢?正常情况下. 如果手机旋转了.当前Activity后杀掉,然后根据方向重新加载这个Activity. 就会从onCreate开始重新加载.如果你设置了 这个选项, 当手机旋转后,当前Activity之后调用onConfigurationChanged() 方法. 而不跑onCreate方法等.
4、android:excludeFromRecents
是否可被显示在最近打开的activity列表里,默认是false
5、android:finishOnTaskLaunch
当用户重新启动这个任务的时候,是否关闭已打开的activity,默认是false
如果这个属性和allowTaskReparenting都是true,这个属性就是王牌。Activity的亲和力将被忽略。该Activity已经被摧毁并非re-parented
6、android:launchMode(Activity加载模式)
在多Activity开发中,有可能是自己应用之间的Activity跳转,或者夹带其他应用的可复用Activity。可能会希望跳转到原来某个Activity实例,而不是产生大量重复的Activity。这需要为Activity配置特定的加载模式,而不是使用默认的加载模式
Activity有四种加载模式:
standard、singleTop、singleTask、singleInstance(其中前两个是一组、后两个是一组),默认为standard
standard:就是intent将发送给新的实例,所以每次跳转都会生成新的activity。
singleTop:也是发送新的实例,但不同standard的一点是,在请求的Activity正好位于栈顶时(配置成singleTop的Activity),不会构造新的实例
singleTask:和后面的singleInstance都只创建一个实例,当intent到来,需要创建设置为singleTask的Activity的时候,系统会检查栈里面是否已经有该Activity的实例。如果有直接将intent发送给它。
singleInstance:
首先说明一下task这个概念,Task可以认为是一个栈,可放入多个Activity。比如启动一个应用,那么Android就创建了一个Task,然后启动这个应用的入口Activity,那在它的界面上调用其他的Activity也只是在这个task里面。那如果在多个task中共享一个Activity的话怎么办呢。举个例来说,如果开启一个导游服务类的应用程序,里面有个Activity是开启GOOGLE地图的,当按下home键退回到主菜单又启动GOOGLE地图的应用时,显示的就是刚才的地图,实际上是同一个Activity,实际上这就引入了singleInstance。singleInstance模式就是将该Activity单独放入一个栈中,这样这个栈中只有这一个Activity,不同应用的intent都由这个Activity接收和展示,这样就做到了共享。当然前提是这些应用都没有被销毁,所以刚才是按下的HOME键,如果按下了返回键,则无效
7、android:multiprocess
是否允许多进程,默认是false
具体可看该篇文章:http://www.bangchui.org/simple/?t3181.html

8、android:noHistory
当用户从Activity上离开并且它在屏幕上不再可见时,Activity是否从Activity stack中清除并结束。默认是false。Activity不会留下历史痕迹
9、android:screenOrientation
activity显示的模式
默认为unspecified:由系统自动判断显示方向
landscape横屏模式,宽度比高度大
portrait竖屏模式, 高度比宽度大
user模式,用户当前首选的方向
behind模式:和该Activity下面的那个Activity的方向一致(在Activity堆栈中的)
sensor模式:有物理的感应器来决定。如果用户旋转设备这屏幕会横竖屏切换
nosensor模式:忽略物理感应器,这样就不会随着用户旋转设备而更改了
10、android:stateNotNeeded
activity被销毁或者成功重启时是否保存状态
11、android:windowSoftInputMode
activity主窗口与软键盘的交互模式,可以用来避免输入法面板遮挡问题,Android1.5后的一个新特性。
这个属性能影响两件事情:
【A】当有焦点产生时,软键盘是隐藏还是显示
【B】是否减少活动主窗口大小以便腾出空间放软键盘
各值的含义:
【A】stateUnspecified:软键盘的状态并没有指定,系统将选择一个合适的状态或依赖于主题的设置
【B】stateUnchanged:当这个activity出现时,软键盘将一直保持在上一个activity里的状态,无论是隐藏还是显示
【C】stateHidden:用户选择activity时,软键盘总是被隐藏
【D】stateAlwaysHidden:当该Activity主窗口获取焦点时,软键盘也总是被隐藏的
【E】stateVisible:软键盘通常是可见的
【F】stateAlwaysVisible:用户选择activity时,软键盘总是显示的状态
【G】adjustUnspecified:默认设置,通常由系统自行决定是隐藏还是显示
【H】adjustResize:该Activity总是调整屏幕的大小以便留出软键盘的空间
【I】adjustPan:当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分
4、第四层(<intent-filter>)
结构图:
<intent-filter android:icon="drawable resource" android:label="string resource" android:priority="integer" >
<action />
<category />
<data />
</intent-filter>
intent-filter属性
android:priority(解释:有序广播主要是按照声明的优先级别,如A的级别高于B,那么,广播先传给A,再传给B。优先级别就是用设置priority属性来确定,范围是从-1000~1000,数越大优先级别越高)
Intent filter内会设定的资料包括action,data与category三种。也就是说filter只会与intent里的这三种资料作对比动作
action属性
action很简单,只有android:name这个属性。常见的android:name值为android.intent.action.MAIN,表明此activity是作为应用程序的入口。

category属性
category也只有android:name属性。常见的android:name值为android.intent.category.LAUNCHER(决定应用程序是否显示在程序列表里)

data属性
<data android:host="string" android:mimeType="string" android:path="string" android:pathPattern="string" android:pathPrefix="string" android:port="string" android:scheme="string"/>
【1】每个<data>元素指定一个URI和数据类型(MIME类型)。它有四个属性scheme、host、port、path对应于URI的每个部分:scheme://host:port/path
scheme的值一般为"http",host为包名,port为端口号,path为具体地址。如:http://com.test.project:200/folder/etc

其中host和port合起来构成URI的凭据(authority),如果host没有指定,则port也会被忽略
要让authority有意义,scheme也必须要指定。要让path有意义,scheme+authority也必须要指定
【2】mimeType(指定数据类型),若mimeType为'Image',则会从content Provider的指定地址中获取image类型的数据。还有'video'啥的,若设置为video/mp4,则表示在指定地址中获取mp4格式的video文件
【3】而pathPattern和PathPrefix主要是为了格式化path所使用的
5、第四层<meta-data>
<meta-data android:name="string" android:resource="resource specification" android:value="string"/>
这是该元素的基本结构.可以包含在<activity> <activity-alias> <service> <receiver>四个元素中。
android:name(解释:元数据项的名字,为了保证这个名字是唯一的,采用java风格的命名规范,如com.woody.project.fried)
android:resource(解释:资源的一个引用,指定给这个项的值是该资源的id。该id可以通过方法Bundle.getInt()来从meta-data中找到。)
android:value(解释:指定给这一项的值。可以作为值来指定的数据类型并且组件用来找回那些值的Bundle方法:[getString],[getInt],[getFloat],[getString],[getBoolean])

第三层<service>
【1】service与activity同级,与activity不同的是,它不能自己启动的,运行在后台的程序,如果我们退出应用时,Service进程并没有结束,它仍然在后台运行。比如听音乐,网络下载数据等,都是由service运行的
【2】service生命周期:Service只继承了onCreate(),onStart(),onDestroy()三个方法,第一次启动Service时,先后调用了onCreate(),onStart()这两个方法,当停止Service时,则执行onDestroy()方法,如果Service已经启动了,当我们再次启动Service时,不会在执行onCreate()方法,而是直接执行onStart()方法
【3】service与activity间的通信
Service后端的数据最终还是要呈现在前端Activity之上的,因为启动Service时,系统会重新开启一个新的进程,这就涉及到不同进程间通信的问题了(AIDL),Activity与service间的通信主要用IBinder负责

推荐阅读更多精彩内容