android关于AndroidManifest.xml详细分析【转】

1、关于AndroidManifest.xml
AndroidManifest.xml 是每一个android程序中必须的文件。它位于整个项目的根目录,描述了package中暴露的组件(activities, services, 等等),他们各自的实现类,各类能被处理的数据和启动位置。 除了能声明程序中的Activities, ContentProviders, Services, 和Intent Receivers,还能指定permissions和instrumentation(安全控制和测试)html

2、AndroidManifest.xml结构前端

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?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>

3、各个节点的详细介绍
一、第一层():(属性)java

1
2
3
4
5
6
7
8
<manifest  xmlns: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>

A、xmlns:android
定义android命名空间,通常为 http://schemas.android.com/apk/res/android ,这样使得Android中各类标准属性能在文件中使用,提供了大部分元素中的数据。
B、package
指定本应用内java主程序包的包名,它也是一个应用进程的默认名称
C、sharedUserId
代表数据权限,由于默认状况下,Android给每一个APK分配一个惟一的UserID,因此是默认禁止不一样APK访问共享数据的。若要共享数据,第一能够采用Share Preference方法,第二种就能够采用sharedUserId了,将不一样APK的sharedUserId都设为同样,则这些APK之间就能够互相共享数据了。
Android给每一个APK进程分配一个单独的用户空间,其manifest中的userid就是对应一个Linux用户(Android 系统是基于Linux)的.因此不一样APK(用户)间互相访问数据默认是禁止的.可是它也提供了2种APK间共享数据的形式:
1. Share Preference. / Content Provider
APK能够指定接口和数据给任何其余APK读取. 须要本身实现接口和Share的数据.
本文对于这个不作详细解释
2. Shared User id
经过Shared User id,拥有同一个User id的多个APK能够配置成运行在同一个进程中.因此默认就是能够互相访问任意数据. 也能够配置成运行成不一样的进程, 同时能够访问其余APK的数据目录下的数据库和文件.就像访问本程序的数据同样.好比某个公司开发了多个Android 程序, 那么能够把数据,图片等资源集中放到APK A中去. 而后这个公司的全部APK都使用同一个User ID, 那么全部的资源均可以从APK A中读取.
举个例子:
APK A 和APK B 都是C公司的产品,那么若是用户从APK A中登录成功.那么打开APK B的时候就不用
再次登录. 具体实现就是 A和B设置成同一个User ID:
* 在2个APK的AndroidManifest.xml 配置User ID:android

1
2
3
  <manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.android.demo.a1"
    android:sharedUserId="com.c">

这个"com.c" 就是user id, 而后packagename APK A就是上面的内容, APK B可能
是"com.android.demo.b1" 这个没有限制web

这个设定好以后, APK B就能够像打开本地数据库那样 打开APK A中的数据库了.
APK A把登录信息存放在A的数据目录下面. APK B每次启动的时候读取APK A下面的数据库
判断是否已经登录:
APK B中的代码:数据库

1
2
3
       friendContext = this.createPackageContext(
                    "com.android.demo.a1",
                    Context.CONTEXT_IGNORE_SECURITY);

经过A的package name 就能够获得A的 packagecontext
经过这个context就能够直接打开数据库
D、sharedUserLabel
一个共享的用户名,它只有在设置了sharedUserId属性的前提下才会有意义
E、versionCode
是给设备程序识别版本(升级)用的必须是一个interger值表明app更新过多少次,好比初版通常为1,以后若要更新版本就设置为2,3等等。。。
F、versionName
这个名称是给用户看的,你能够将你的APP版本号设置为1.1版,后续更新版本设置为1.二、2.0版本等等。。。
G、installLocation
安装参数,是Android2.2中的一个新特性,installLocation有三个值能够选择:internalOnly、auto、preferExternal
选择preferExternal,系统会优先考虑将APK安装到SD卡上(固然最终用户能够选择为内部ROM存储上,若是SD存储已满,也会安装到内部存储上)
选择auto,系统将会根据存储空间本身去适应
选择internalOnly是指必须安装到内部才能运行
(注:须要进行后台类监控的APP最好安装在内部,而一些较大的游戏APP最好安装在SD卡上。现默认为安装在内部,若是把APP安装在SD卡上,首先得设置你的level为8,而且要配置android:installLocation这个参数的属性为preferExternal)后端

二、第二层():属性
一个AndroidManifest.xml中必须含有一个Application标签,这个标签声明了每个应用程序的组件及其属性(如icon,label,permission等)api

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
<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>

A、android:allowClearUserData('true' or 'false')
用户是否能选择自行清除数据,默认为true,程序管理器包含一个选择容许用户清除数据。当为true时,用户可本身清理用户数据,反之亦然
B、android:allowTaskReparenting('true' or 'false')
是否容许activity更换从属的任务,好比从短信息任务切换到浏览器任务
C、android:backupAgent
这也是Android2.2中的一个新特性,设置该APP的备份,属性值应该是一个完整的类名,如com.project.TestCase,此属性并无默认值,而且类名必须得指定(就是个备份工具,将数据备份到云端的操做)
D、android:debuggable
这个从字面上就能够看出是什么做用的,当设置为true时,代表该APP在手机上能够被调试。默认为false,在false的状况下调试该APP,就会报如下错误:
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.
E、android:description/android:label
此两个属性都是为许可提供的,均为字符串资源,当用户去看许可列表(android:label)或者某个许可的详细信息(android:description)时,这些字符串资源就能够显示给用户。label应当尽可能简短,之须要告知用户该许但是在保护什么功能就行。而description能够用于具体描述获取该许可的程序能够作哪些事情,实际上让用户能够知道若是他们赞成程序获取该权限的话,该程序能够作什么。咱们一般用两句话来描述许可,第一句描述该许可,第二句警告用户若是批准该权限会可能有什么很差的事情发生
F、android:enabled
Android系统是否可以实例化该应用程序的组件,若是为true,每一个组件的enabled属性决定那个组件是否能够被 enabled。若是为false,它覆盖组件指定的值;全部组件都是disabled。
G、android:hasCode('true' or 'false')
表示此APP是否包含任何的代码,默认为true,若为false,则系统在运行组件时,不会去尝试加载任何的APP代码
一个应用程序自身不会含有任何的代码,除非内置组件类,好比Activity类,此类使用了AliasActivity类,固然这是个罕见的现象
(在Android2.3能够用标准C来开发应用程序,可在androidManifest.xml中将此属性设置为false,由于这个APP自己已经不含有任何的JAVA代码了)
H、android:icon
这个很简单,就是声明整个APP的图标,图片通常都放在drawable文件夹下
I、android:killAfterRestore
是否复位须要重启
J、android:manageSpaceActivity
让应用手动管理应用的数据目录
K、android:name
为应用程序所实现的Application子类的全名。当应用程序进程开始时,该类在全部应用程序组件以前被实例化。
若该类(比方androidMain类)是在声明的package下,则能够直接声明android:name="androidMain",但此类是在package下面的子包的话,就必须声明为全路径或android:name="package名称.子包名成.androidMain"
L、android:permission
设置许可名,这个属性若在上定义的话,是一个给应用程序的全部组件设置许可的便捷方式,固然它是被各组件设置的许可名所覆盖的
M、android:presistent
该应用程序是否应该在任什么时候候都保持运行状态,默认为false。由于应用程序一般不该该设置本标识,持续模式仅仅应该设置给某些系统应用程序才是有意义的。
N、android:process
应用程序运行的进程名,它的默认值为元素里设置的包名,固然每一个组件均可以经过设置该属性来覆盖默认值。若是你想两个应用程序共用一个进程的话,你能够设置他们的android:process相同,但前提条件是他们共享一个用户ID及被赋予了相同证书的时候
O、android:restoreAnyVersion
一样也是android2.2的一个新特性,用来代表应用是否准备尝试恢复全部的备份,甚至该备份是比当前设备上更要新的版本,默认是false
P、android:taskAffinity
拥有相同的affinity的Activity理论上属于相同的Task,应用程序默认的affinity的名字是元素中设定的package名
Q、android:theme
是一个资源的风格,它定义了一个默认的主题风格给全部的activity,固然也能够在本身的theme里面去设置它,有点相似style。浏览器

三、第三层():属性安全

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<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>

(注:有些在application中重复的就很少阐述了)
A、android:alwaysRetainTaskState
是否保留状态不变, 好比切换回home, 再重新打开,activity处于最后的状态。好比一个浏览器拥有不少状态(当打开了多个TAB的时候),用户并不但愿丢失这些状态时,此时可将此属性设置为true
B、android:clearTaskOnLaunch
好比 P 是 activity, Q 是被P 触发的 activity, 而后返回Home, 从新启动 P,是否显示 Q
C、android:configChanges
当配置list发生修改时, 是否调用 onConfigurationChanged() 方法 好比 "locale|navigation|orientation". 这个我用过,主要用来看手机方向改变的. android手机在旋转后,layout会从新布局, 如何作到呢?正常状况下. 若是手机旋转了.当前Activity后杀掉,而后根据方向从新加载这个Activity. 就会从onCreate开始从新加载.若是你设置了 这个选项, 当手机旋转后,当前Activity以后调用onConfigurationChanged() 方法. 而不跑onCreate方法等.
D、android:excludeFromRecents
是否可被显示在最近打开的activity列表里,默认是false
E、android:finishOnTaskLaunch
当用户从新启动这个任务的时候,是否关闭已打开的activity,默认是false若是这个属性和allowTaskReparenting都是true,这个属性就是王牌。Activity的亲和力将被忽略。该Activity已经被摧毁并不是re-parented
F、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键,若是按下了返回键,则无效
G、android:multiprocess
是否容许多进程,默认是false
在实际开发中,CP有如下两种用法:
1)和应用在一个APK包里
这种状况下和应用在同一进程中。process name和uid都同样。
2)单独在一个APK包里。
这种状况下,若是在AndroidManifest.xml文件里声明了和某个进程同属一个进程,如:

1
2
3
4
5
6
7
package="com.android.providers.telephony"
android:sharedUserId="android.uid.phone">                
android:allowClearUserData="false"                 
android:label="Dialer Storage"                 
android:icon="@drawable/ic_launcher_phone">  
android:authorities="telephony" 
android:multiprocess="true" />

这个里面经过android:sharedUserId="android.uid.phone"和android:process="com.android.phone"声明了该CP是和phone进程同属一个进程,拥有一样的process name和uid.
若是没有上述声明,那么该CP是在独立的进程中,拥有属于本身的process name和uid.
以上两种用法能够总结为:
1)CP和某个进程同属一个进程
这种状况下,当该进程启动时,会搜索属于该进程的全部CP,并加载。
2)CP属于独立的一个进程。
这种状况下,只有须要用到该CP时,才会去加载。
那么,当一个进程想要操做一个CP时,先须要获取该CP的对象,系统是如何处理呢:
1)若是该CP属于当前主叫进程,由于在进程启动时就已经加载过了,因此系统会直接返回该CP的对象。
2)若是该CP不属于当前主叫进程,那么系统会进行相关处理(由ActivityManagerService进行,如下简称为AMS):
全部已加载的CP信息都已保存在AMS中。当须要获取某个CP的对象时,AMS会先判断该CP是否已被加载
----若是已被加载,该CP和当前主叫进程不属一个进程,可是该CP设置了multiprocess的属性(如上例中的android:multiprocess="true"),而且该CP属于系统级CP,那么就在当前主叫进程内部新生成该CP的对象。不然就须要经过IPC机制进行调用。
----若是还未被加载,该CP和当前主叫进程不属一个进程,可是该CP设置了multiprocess的属性(如上例中的android:multiprocess="true"),而且该CP属于系统级CP,那么就在当前主叫进程内部新生成该CP的对象。不然就须要先建立该CP所在的进程,而后再经过IPC机制进行调用。
H、android:noHistory
当用户从Activity上离开而且它在屏幕上再也不可见时,Activity是否从Activity stack中清除并结束。默认是false。Activity不会留下历史痕迹
I、android:screenOrientation
activity显示的模式
默认为unspecified:由系统自动判断显示方向
landscape横屏模式,宽度比高度大
portrait竖屏模式, 高度比宽度大
user模式,用户当前首选的方向
behind模式:和该Activity下面的那个Activity的方向一致(在Activity堆栈中的)
sensor模式:有物理的感应器来决定。若是用户旋转设备这屏幕会横竖屏切换
nosensor模式:忽略物理感应器,这样就不会随着用户旋转设备而更改了
J、android:stateNotNeeded
activity被销毁或者成功重启时是否保存状态
K、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:当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能老是看到输入内容的部分

四、第四层()
结构图:

1
2
3
4
5
6
7
<intent-filter  android:icon="drawable resource"
               android:label="string resource"
               android:priority="integer" >
      <action />
      <category />
      <data />
</intent-filter> 

A、intent-filter属性
android:priority(解释:有序广播主要是按照声明的优先级别,如A的级别高于B,那么,广播先传给A,再传给B。优先级别就是用设置priority属性来肯定,范围是从-1000~1000,数越大优先级别越高)Intent filter内会设定的资料包括action,data与category三种。也就是说filter只会与intent里的这三种资料做对比动做
B、action属性
action很简单,只有android:name这个属性。常见的android:name值为android.intent.action.MAIN,代表此activity是做为应用程序的入口。

有关android:name的具体值:
String ADD_SHORTCUT_ACTION 动做:
在系统中添加一个快捷方式。
"android.intent.action.ADD_SHORTCUT" String ALL_APPS_ACTION 动做:
列举全部可用的应用。
"android.intent.action.ALL_APPS" String ALTERNATIVE_CATEGORY 类别:
说明 activity 是用户正在浏览的数据的一个可选操做。输入:无。
"android.intent.category.ALTERNATIVE" String ANSWER_ACTION 动做:
处理拨入的电话。
"android.intent.action.ANSWER" String BATTERY_CHANGED_ACTION 广播:
充电状态,或者电池的电量发生变化。
"android.intent.action.BATTERY_CHANGED" String BOOT_COMPLETED_ACTION 广播:
在系统启动后,这个动做被广播一次(只有一次)。
"android.intent.action.BOOT_COMPLETED" String BROWSABLE_CATEGORY 类别:
可以被浏览器安全使用的 activities 必须支持这个类别。
"android.intent.category.BROWSABLE" String BUG_REPORT_ACTION 动做:
显示 activity 报告错误。
"android.intent.action.BUG_REPORT" String CALL_ACTION 动做:
拨打电话,被呼叫的联系人在数据中指定。
"android.intent.action.CALL" String CALL_FORWARDING_STATE_CHANGED_ACTION 广播:
语音电话的呼叫转移状态已经改变。
"android.intent.action.CFF" String CLEAR_CREDENTIALS_ACTION 动做:
清除登录凭证 (credential)。
"android.intent.action.CLEAR_CREDENTIALS" String CONFIGURATION_CHANGED_ACTION 广播:
设备的配置信息已经改变。
String DATA_ACTIVITY_STATE_CHANGED_ACTION 广播:
电话的数据活动(data activity)状态(即收发数据的状态)已经改变。 "android.intent.action.DATA_ACTIVITY" String DATA_CONNECTION_STATE_CHANGED_ACTION 广播:电话的数据链接状态已经改变。
"android.intent.action.DATA_STATE" String DATE_CHANGED_ACTION 广播:
日期被改变。
"android.intent.action.DATE_CHANGED" String DEFAULT_ACTION 动做:
和 VIEW_ACTION 相同,是在数据上执行的标准动做。
"android.intent.action.VIEW" String DEFAULT_CATEGORY 类别:
若是 activity 是对数据执行确省动做(点击, center press)的一个选项,须要设置这个类别。 "android.intent.category.DEFAULT" String DELETE_ACTION 动做:
从容器中删除给定的数据。
"android.intent.action.DELETE" String DEVELOPMENT_PREFERENCE_CATEGORY 类别:
说明 activity 是一个设置面板 (development preference panel). "android.intent.category.DEVELOPMENT_PREFERENCE" String DIAL_ACTION 动做:
拨打数据中指定的电话号码。
"android.intent.action.DIAL String EDIT_ACTION 动做:
为制定的数据显示可编辑界面。
"android.intent.action.EDIT" String EMBED_CATEGORY 类别:
可以在上级(父)activity 中运行。
"android.intent.category.EMBED" String EMERGENCY_DIAL_ACTION 动做:
拨打紧急电话号码。
"android.intent.action.EMERGENCY_DIAL" int FORWARD_RESULT_LAUNCH 启动标记:
若是这个标记被设置,并且被一个已经存在的 activity 用来启动新的 activity,已有 activity 的回复目标 (reply target) 会被转移给新的 activity。
16 0x00000010 String FOTA_CANCEL_ACTION 广播:
取消全部被挂起的 (pending) 更新下载。
"android.server.checkin.FOTA_CANCEL" String FOTA_INSTALL_ACTION 广播:
更新已经被确认,立刻就要开始安装。
"android.server.checkin.FOTA_INSTALL" String FOTA_READY_ACTION 广播:
更新已经被下载,能够开始安装。
"android.server.checkin.FOTA_READY" String FOTA_RESTART_ACTION 广播:
恢复已经中止的更新下载。
"android.server.checkin.FOTA_RESTART" String FOTA_UPDATE_ACTION 广播:
经过 OTA 下载并安装操做系统更新。
"android.server.checkin.FOTA_UPDATE" String FRAMEWORK_INSTRUMENTATION_TEST_CATEGORY 类别:
做为代码框架下仪器的测试。
"android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" String GADGET_CATEGORY 类别:这个 activity 能够被嵌入宿主 activity (activity that is hosting gadgets)。 "android.intent.category.GADGET" String GET_CONTENT_ACTION 动做:
让用户选择数据并返回。
"android.intent.action.GET_CONTENT" String HOME_CATEGORY 类别:
主屏幕 (activity),设备启动后显示的第一个 activity。
"android.intent.category.HOME" String INSERT_ACTION 动做:
在容器中插入一个空项 (item)。
"android.intent.action.INSERT" String INTENT_EXTRA 附加数据:
和PICK_ACTIVITY_ACTION 一块儿使用时,说明用户选择的用来显示的 activity;
和ADD_SHORTCUT_ACTION 一块儿使用的时候,描述要添加的快捷方式。 "android.intent.extra.INTENT" String LABEL_EXTRA 附加数据:
大写字母开头的字符标签,和 ADD_SHORTCUT_ACTION 一块儿使用。
"android.intent.extra.LABEL" String LAUNCHER_CATEGORY 类别:
Activity 应该被显示在顶级的launcher 中。
"android.intent.category.LAUNCHER" String LOGIN_ACTION 动做:
获取登陆凭证。
"android.intent.action.LOGIN" String MAIN_ACTION 动做:
做为主入口点启动,不须要数据。
"android.intent.action.MAIN" String MEDIABUTTON_ACTION 广播:
用户按下了“Media Button”。
"android.intent.action.MEDIABUTTON" String MEDIA_BAD_REMOVAL_ACTION 广播:
扩展介质(扩展卡)已经从 SD 卡插槽拔出,可是挂载点 (mount point) 还没解除 (unmount)。 "android.intent.action.MEDIA_BAD_REMOVAL" String MEDIA_EJECT_ACTION 广播:
用户想要移除扩展介质(拔掉扩展卡)。
"android.intent.action.MEDIA_EJECT" String MEDIA_MOUNTED_ACTION 广播:
扩展介质被插入,并且已经被挂载。
"android.intent.action.MEDIA_MOUNTED" String MEDIA_REMOVED_ACTION 广播:
扩展介质被移除。
"android.intent.action.MEDIA_REMOVED" String MEDIA_SCANNER_FINISHED_ACTION 广播:
已经扫描完介质的一个目录。
"android.intent.action.MEDIA_SCANNER_FINISHED" String MEDIA_SCANNER_STARTED_ACTION 广播:
开始扫描介质的一个目录。
"android.intent.action.MEDIA_SCANNER_STARTED" String MEDIA_SHARED_ACTION 广播:
扩展介质的挂载被解除 (unmount),由于它已经做为 USB 大容量存储被共享。 "android.intent.action.MEDIA_SHARED" String MEDIA_UNMOUNTED_ACTION 广播:
扩展介质存在,可是尚未被挂载 (mount)。
"android.intent.action.MEDIA_UNMOUNTED" String MESSAGE_WAITING_STATE_CHANGED_ACTION 广播:
电话的消息等待(语音邮件)状态已经改变。
"android.intent.action.MWI" int MULTIPLE_TASK_LAUNCH 启动标记:
和 NEW_TASK_LAUNCH 联合使用,禁止将已有的任务改变为前景任务 (foreground)。
8 0x00000008 String NETWORK_TICKLE_RECEIVED_ACTION 广播:
设备收到了新的网络 "tickle" 通知。
"android.intent.action.NETWORK_TICKLE_RECEIVED" int NEW_TASK_LAUNCH 启动标记:
设置之后,activity 将成为历史堆栈中的第一个新任务(栈顶)。
4 0x00000004 int NO_HISTORY_LAUNCH 启动标记:
设置之后,新的 activity 不会被保存在历史堆栈中。
1 0x00000001 String PACKAGE_ADDED_ACTION 广播:
设备上新安装了一个应用程序包。
"android.intent.action.PACKAGE_ADDED" String PACKAGE_REMOVED_ACTION 广播:
设备上删除了一个应用程序包。
"android.intent.action.PACKAGE_REMOVED" String PHONE_STATE_CHANGED_ACTION 广播:
电话状态已经改变。
"android.intent.action.PHONE_STATE" String PICK_ACTION 动做:
从数据中选择一个项目 (item),将被选中的项目返回。
"android.intent.action.PICK" String PICK_ACTIVITY_ACTION 动做:
选择一个activity,返回被选择的 activity 的类(名)。
"android.intent.action.PICK_ACTIVITY" String PREFERENCE_CATEGORY 类别:
activity是一个设置面板 (preference panel)。
"android.intent.category.PREFERENCE" String PROVIDER_CHANGED_ACTION 广播:
更新将要(真正)被安装。
"android.intent.action.PROVIDER_CHANGED" String PROVISIONING_CHECK_ACTION 广播:
要求 polling of provisioning service 下载最新的设置。 "android.intent.action.PROVISIONING_CHECK" String RUN_ACTION 动做:
运行数据(指定的应用),不管它(应用)是什么。
"android.intent.action.RUN" String SAMPLE_CODE_CATEGORY 类别:
做为一个示例代码例子(不是普通用户体验的一部分)。 "android.intent.category.SAMPLE_CODE" String SCREEN_OFF_ACTION 广播:
屏幕被关闭。
"android.intent.action.SCREEN_OFF" String SCREEN_ON_ACTION 广播:
屏幕已经被打开。
"android.intent.action.SCREEN_ON" String SELECTED_ALTERNATIVE_CATEGORY 类别:
对于被用户选中的数据,activity 是它的一个可选操做。 "android.intent.category.SELECTED_ALTERNATIVE" String SENDTO_ACTION 动做:
向 data 指定的接收者发送一个消息。
"android.intent.action.SENDTO" String SERVICE_STATE_CHANGED_ACTION 广播:
电话服务的状态已经改变。
"android.intent.action.SERVICE_STATE" String SETTINGS_ACTION 动做:
显示系统设置。输入:无。
"android.intent.action.SETTINGS" String SIGNAL_STRENGTH_CHANGED_ACTION 广播:
电话的信号强度已经改变。
"android.intent.action.SIG_STR" int SINGLE_TOP_LAUNCH 启动标记:
设置之后,若是 activity 已经启动,并且位于历史堆栈的顶端,将再也不启动(不从新启动) activity。 2 0x00000002 String STATISTICS_REPORT_ACTION 广播:
要求 receivers 报告本身的统计信息。
"android.intent.action.STATISTICS_REPORT" String STATISTICS_STATE_CHANGED_ACTION 广播:
统计信息服务的状态已经改变。
"android.intent.action.STATISTICS_STATE_CHANGED" String SYNC_ACTION 动做:
执行数据同步。
"android.intent.action.SYNC" String TAB_CATEGORY 类别:
这个 activity 应该在 TabActivity 中做为一个 tab 使用。
"android.intent.category.TAB" String TEMPLATE_EXTRA 附加数据:
新记录的初始化模板。
"android.intent.extra.TEMPLATE" String TEST_CATEGORY 类别:
做为测试目的使用,不是正常的用户体验的一部分。
"android.intent.category.TEST" String TIMEZONE_CHANGED_ACTION 广播:
时区已经改变。
"android.intent.action.TIMEZONE_CHANGED" String TIME_CHANGED_ACTION 广播:
时间已经改变(从新设置)。
"android.intent.action.TIME_SET" String TIME_TICK_ACTION 广播:
当前时间已经变化(正常的时间流逝)。
"android.intent.action.TIME_TICK" String UMS_CONNECTED_ACTION 广播:
设备进入 USB 大容量存储模式。
"android.intent.action.UMS_CONNECTED" String UMS_DISCONNECTED_ACTION 广播:
设备从 USB 大容量存储模式退出。
"android.intent.action.UMS_DISCONNECTED" String UNIT_TEST_CATEGORY 类别:
应该被用做单元测试(经过 test harness 运行)。
"android.intent.category.UNIT_TEST" String VIEW_ACTION 动做:
向用户显示数据。
"android.intent.action.VIEW" String WALLPAPER_CATEGORY 类别:
这个 activity 能过为设备设置墙纸。
"android.intent.category.WALLPAPER" String WALLPAPER_CHANGED_ACTION 广播:
系统的墙纸已经改变。
"android.intent.action.WALLPAPER_CHANGED" String WALLPAPER_SETTINGS_ACTION 动做:
显示选择墙纸的设置界面。输入:无。
"android.intent.action.WALLPAPER_SETTINGS" String WEB_SEARCH_ACTION 动做:
执行 web 搜索。
"android.intent.action.WEB_SEARCH" String XMPP_CONNECTED_ACTION 广播:
XMPP 链接已经被创建。
"android.intent.action.XMPP_CONNECTED" String XMPP_DISCONNECTED_ACTION 广播:
XMPP 链接已经被断开。

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

设置这个activity是否能够被认为是用户正在浏览的数据的一个可选择的action

CATEGORY_APP_BROWSER

和ACTION_MAIN一块儿使用,用来启动浏览器应用程序

CATEGORY_APP_CALCULATOR

和ACTION_MAIN一块儿使用,用来启动计算器应用程序

CATEGORY_APP_CALENDAR

和ACTION_MAIN一块儿使用,用来启动日历应用程序

CATEGORY_APP_CONTACTS

和ACTION_MAIN一块儿使用,用来启动联系人应用程序

CATEGORY_APP_EMAIL

和ACTION_MAIN一块儿使用,用来启动邮件应用程序

CATEGORY_APP_GALLERY

和ACTION_MAIN一块儿使用,用来启动图库应用程序

CATEGORY_APP_MAPS

和ACTION_MAIN一块儿使用,用来启动地图应用程序

CATEGORY_APP_MARKET

这个activity容许用户浏览和下载新的应用程序

CATEGORY_APP_MESSAGING

和ACTION_MAIN一块儿使用,用来启动短信应用程序

CATEGORY_APP_MUSIC

和ACTION_MAIN一块儿使用,用来启动音乐应用程序

CATEGORY_BROWSABLE

可以被浏览器安全调用的activity必须支持这个category

CATEGORY_DEFAULT

设置这个activity对于默认的action是不是一个可选的

CATEGORY_EMBED

能够运行在父activity容器内

CATEGORY_HOME

主activity,当应用程序启动时,它是第一个显示的activity

CATEGORY_LAUNCHER

应该在上层的启动列表里显示

CATEGORY_MONKEY

这个activity可能被monkey或者其余的自动测试工具执行

CATEGORY_OPENABLE

用来指示一个GET_CONTENT意图只但愿ContentResolver.openInputStream可以打开URI

CATEGORY_PREFERENCE

这个activity是一个选项卡

CATEGORY_SAMPLE_CODE

做为一个简单的代码示例使用(通常状况下不使用)

CATEGORY_SELECTED_ALTERNATIVE

设置这个activity是否能够被认为是用户当前选择的数据的一个可选择的action

CATEGORY_TAB

想要在已有的TabActivity内部做为一个Tab使用

CATEGORY_TEST

供测试使用(通常状况不使用)

CATEGORY_UNIT_TEST

联合测试使用

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
Ddata属性
<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类型)。
它有四个属性schemehostportpath对应于URI的每一个部分: 
scheme://host:port/path
scheme的值通常为"http"host为包名,port为端口号,path为具体地址。如:http://com.test.project:200/folder/etc
其中hostport合起来构成URI的凭据(authority),若是host没有指定,则port也会被忽略
要让authority有意义,scheme也必需要指定。要让path有意义,scheme+authority也必需要指定
2mimeType(指定数据类型),若mimeType为'Image',则会从content Provider的指定地址中获取image类型的数据。还有'video'啥的,若设置为video/mp4,则表示在指定地址中获取mp4格式的video文件
3】而pathPatternPathPrefix主要是为了格式化path所使用的


```java
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]


```java
6、第三层<activity-alias>属性
<activity-alias android:enabled=["true" | "false"]
                android:exported=["true" | "false"]
                android:icon="drawable resource"
                android:label="string resource"
                android:name="string"
                android:permission="string"
                android:targetActivity="string">
<intent-filter/> 
<meta-data/>
</activity-alias>
<activity-alias>是为activity建立快捷方式的,以下实例:

<activity android:name=".shortcut">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
            </intent-filter>
</activity>
 <activity-alias 
    android:name=".CreateShortcuts" 
    android:targetActivity=".shortcut" 
    android:label="@string/shortcut">
    <intent-filter>
             <action android:name="android.intent.action.CREATE_SHORTCUT" />
             <category android:name="android.intent.category.DEFAULT" />
     </intent-filter>
 </activity-alias>


```其中android.targetActivity是指向对应快捷方式的activity,如上述的shortcut(Activity)
android:label是指快捷方式的名称,而快捷方式的图标默认是给定的application图标


```java
7、第三层<service>


```【1serviceactivity同级,与activity不一样的是,它不能本身启动的,运行在后台的程序,若是咱们退出应用时,Service进程并无结束,它仍然在后台运行。好比听音乐,网络下载数据等,都是由service运行的
2service生命周期:Service只继承了onCreate(),onStart(),onDestroy()三个方法,第一次启动Service时,前后调用了onCreate(),onStart()这两个方法,当中止Service时,则执行onDestroy()方法,若是Service已经启动了,当咱们再次启动Service时,不会在执行onCreate()方法,而是直接执行onStart()方法
3serviceactivity间的通讯
Service后端的数据最终仍是要呈如今前端Activity之上的,由于启动Service时,系统会从新开启一个新的进程,这就涉及到不一样进程间通讯的问题了(AIDL)Activityservice间的通讯主要用IBinder负责。
4

```java
<service android:enabled=["true" | "false"]
         android:exported[="true" | "false"]
         android:icon="drawable resource"
         android:label="string resource"
         android:name="string"
         android:permission="string"
         android:process="string">
</service>

service标签内的属性以前已有描述,在此不重复了~

1
8、第三层<receiver>

receiver的属性与service同样,这里就不显示了
BroadcastReceiver:用于发送广播,broadcast是在应用程序之间传输信息的一种机制,而BroadcastReceiver是对发送出来的 Broadcast进行过滤接受并响应的一类组件Android BroadcastReceiver 简介
在 Android 中使用 Activity, Service, Broadcast, BroadcastReceiver
活动(Activity) - 用于表现功能

服务(Service) - 至关于后台运行的 Activity
广播(Broadcast) - 用于发送广播

广播接收器(BroadcastReceiver) - 用于接收广播
Intent - 用于链接以上各个组件,并在其间传递消息
BroadcastReceiver
在Android中,Broadcast是一种普遍运用的在应用程序之间传输信息的机制。而BroadcastReceiver是对发送出来的 Broadcast进行过滤接受并响应的一类组件。下面将详细的阐述如何发送Broadcast和使用BroadcastReceiver过 滤接收的过程:
首先在须要发送信息的地方,把要发送的信息和用于过滤的信息(如Action、Category)装入一个Intent对象,而后经过调用 Context.sendBroadcast()、sendOrderBroadcast()或sendStickyBroadcast()方法,把 Intent对象以广播方式发送出去。
当Intent发送之后,全部已经注册的BroadcastReceiver会检查注册时的IntentFilter是否与发送的Intent相匹配,若 匹配则就会调用BroadcastReceiver的onReceive()方法。因此当咱们定义一个BroadcastReceiver的时候,都须要 实现onReceive()方法。

注册BroadcastReceiver有两种方式:
一种方式是,静态的在AndroidManifest.xml中用标签生命注册,并在标签内用标签设置过滤器。
另外一种方式是,动态的在代码中先定义并设置好一个 IntentFilter对象,而后在须要注册的地方调 Context.registerReceiver()方法,若是取消时就调用Context.unregisterReceiver()方法。若是用动 态方式注册的BroadcastReceiver的Context对象被销毁时,BroadcastReceiver也就自动取消注册了。
另外,若在使用sendBroadcast()的方法是指定了接收权限,则只有在AndroidManifest.xml中用标签声明了拥有此权限的BroascastReceiver才会有可能接收到发送来的Broadcast。
一样,若在注册BroadcastReceiver时指定了可接收的Broadcast的权限,则只有在包内的AndroidManifest.xml中 用标签声明了,拥有此权限的Context对象所发送的Broadcast才能被这个 BroadcastReceiver所接收。
动态注册:
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(String);--为 BroadcastReceiver指定action,使之用于接收同action的广播 registerReceiver(BroadcastReceiver,intentFilter);
通常:在onStart中注册,onStop中取消unregisterReceiver
发送广播消息:extends Service
指定广播目标Action:Intent Intent = new Intent(action-String)
--指定了此action的receiver会接收此广播
需传递参数(可选) putExtra();
发送:sendBroadcast(Intent);

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
9、第三层<provider>属性
<provider android:authorities="list"
          android:enabled=["true" | "false"]
          android:exported=["true" | "false"]
          android:grantUriPermissions=["true" | "false"]
          android:icon="drawable resource"
          android:initOrder="integer"
          android:label="string resource"
          android:multiprocess=["true" | "false"]
          android:name="string"
          android:permission="string"
          android:process="string"
          android:readPermission="string"
          android:syncable=["true" | "false"]
          android:writePermission="string">
           <grant-uri-permission/>
           <meta-data/>
</provider>


```contentProvider(数据存储)
1android:authorities
标识这个ContentProvider,调用者能够根据这个标识来找到它
2android:grantUriPermission
对某个URI授予的权限
3android:initOrder


```java
10、第三层<uses-library>


```用户库,可自定义。全部android的包均可以引用


```java
11、第一层<supports-screens>
<supports-screens  android:smallScreens=["true" | "false"] 
                  android:normalScreens=["true" | "false"] 
                  android:largeScreens=["true" | "false"] 
                  android:anyDensity=["true" | "false"] />


```这是在android1.6之后的新特性,支持多屏幕机制各属性含义:这四个属性,是否支持大屏,是否支持中屏,是否支持小屏,是否支持多种不一样密度


```java
12、第二层<uses-configuration /><uses-feature>性能都差很少
<uses-configuration  android:reqFiveWayNav=["true" | "false"] 
                    android:reqHardKeyboard=["true" | "false"]
                    android:reqKeyboardType=["undefined" | "nokeys" | "qwerty" |   "twelvekey"]
                    android:reqNavigation=["undefined" | "nonav" | "dpad" |  "trackball" | "wheel"]
                    android:reqTouchScreen=["undefined" | "notouch" | "stylus" | "finger"] />
<uses-feature android:glEsVersion="integer"
              android:name="string"
              android:required=["true" | "false"] />


```这二者都是在描述应用所须要的硬件和软件特性,以便防止应用在没有这些特性的设备上安装。


```java
13、第二层<uses-sdk />
<uses-sdk android:minSdkVersion="integer"
          android:targetSdkVersion="integer"
          android:maxSdkVersion="integer"/>


```描述应用所需的api level,就是版本,目前是android 2.2 = 8android2.1 = 7android1.6 = 4android1.5=3在此属性中能够指定支持的最小版本,目标版本以及最大版本


```java
14、第二层<instrumentation />
<instrumentation android:functionalTest=["true" | "false"]
                 android:handleProfiling=["true" | "false"]
                 android:icon="drawable resource"
                 android:label="string resource"
                 android:name="string"
                 android:targetPackage="string"/>


``` 定义一些用于探测和分析应用性能等等相关的类,能够监控程序。在各个应用程序的组件以前instrumentation类被实例化
android:functionalTest(解释:instrumentation类是否能运行一个功能测试,默认为false)


```java
15<permission><uses-permission><permission-tree /><permission-group />区别

最经常使用的当属,当咱们须要获取某个权限的时候就必须在咱们的manifest文件中声明,此与同级,具体权限列表请看此处
一般状况下咱们不须要为本身的应用程序声明某个权限,除非你提供了供其余应用程序调用的代码或者数据。这个时候你才须要使用 这个标签。很显然这个标签可让咱们声明本身的权限。好比:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<permission android:name="com.teleca.project.MY_SECURITY" . . . />


```那么在activity中就能够声明该自定义权限了,如:

```java
<application . . .>
        <activity android:name="XXX" . . . >
                  android:permission="com.teleca.project.MY_SECURITY"> </activity>
 </application>

固然本身声明的permission也不能随意的使用,仍是须要使用来声明你须要该权限
就是声明一个标签,该标签表明了一组permissions,而是为一组permissions声明了一个namespace。这两个标签能够看以前的系列文章。

原文做者: 冷风の傲

原文地址: http://my.eoe.cn/1087692/archive/5927.html

2013-08-01 16:20:04

相关文章
相关标签/搜索