Android關(guān)于AndroidManifest.xml詳細(xì)分析
一、關(guān)于AndroidManifest.xml
AndroidManifest.xml 是每個(gè)android程序中必須的文件。它位于整個(gè)項(xiàng)目的根目錄,描述了package中暴露的組件(activities, services, 等等),他們各自的實(shí)現(xiàn)類,各種能被處理的數(shù)據(jù)和啟動(dòng)位置。 除了能聲明程序中的Activities, ContentProviders, Services, 和Intent Receivers,還能指定permissions和instrumentation(安全控制和測試)
二、AndroidManifest.xml結(jié)構(gòu)
- <?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>
三、各個(gè)節(jié)點(diǎn)的詳細(xì)介紹
1、第一層():(屬性)
- <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中各種標(biāo)準(zhǔn)屬性能在文件中使用,提供了大部分元素中的數(shù)據(jù)。
B、package
指定本應(yīng)用內(nèi)java主程序包的包名,它也是一個(gè)應(yīng)用進(jìn)程的默認(rèn)名稱
C、sharedUserId
表明數(shù)據(jù)權(quán)限,因?yàn)槟J(rèn)情況下,Android給每個(gè)APK分配一個(gè)唯一的UserID,所以是默認(rèn)禁止不同APK訪問共享數(shù)據(jù)的。若要共享數(shù)據(jù),第一可以采用Share Preference方法,第二種就可以采用sharedUserId了,將不同APK的sharedUserId都設(shè)為一樣,則這些APK之間就可以互相共享數(shù)據(jù)了。
Android給每個(gè)APK進(jìn)程分配一個(gè)單獨(dú)的用戶空間,其manifest中的userid就是對應(yīng)一個(gè)Linux用戶(Android 系統(tǒng)是基于Linux)的.所以不同APK(用戶)間互相訪問數(shù)據(jù)默認(rèn)是禁止的.但是它也提供了2種APK間共享數(shù)據(jù)的形式:
1. Share Preference. / Content Provider
APK可以指定接口和數(shù)據(jù)給任何其他APK讀取. 需要自己實(shí)現(xiàn)接口和Share的數(shù)據(jù).
本文對于這個(gè)不做詳細(xì)解釋
2. Shared User id
通過Shared User id,擁有同一個(gè)User id的多個(gè)APK可以配置成運(yùn)行在同一個(gè)進(jìn)程中.所以默認(rèn)就是可以互相訪問任意數(shù)據(jù). 也可以配置成運(yùn)行成不同的進(jìn)程, 同時(shí)可以訪問其他APK的數(shù)據(jù)目錄下的數(shù)據(jù)庫和文件.就像訪問本程序的數(shù)據(jù)一樣.比如某個(gè)公司開發(fā)了多個(gè)Android 程序, 那么可以把數(shù)據(jù),圖片等資源集中放到APK A中去. 然后這個(gè)公司的所有APK都使用同一個(gè)User ID, 那么所有的資源都可以從APK A中讀取.
舉個(gè)例子:
APK A 和APK B 都是C公司的產(chǎn)品,那么如果用戶從APK A中登陸成功.那么打開APK B的時(shí)候就不用
再次登陸. 具體實(shí)現(xiàn)就是 A和B設(shè)置成同一個(gè)User ID:
* 在2個(gè)APK的AndroidManifest.xml 配置User ID:
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.android.demo.a1"
- android:sharedUserId="com.c">
這個(gè)"com.c" 就是user id, 然后packagename APK A就是上面的內(nèi)容, APK B可能
是"com.android.demo.b1" 這個(gè)沒有限制
這個(gè)設(shè)定好之后, APK B就可以像打開本地?cái)?shù)據(jù)庫那樣 打開APK A中的數(shù)據(jù)庫了.
APK A把登陸信息存放在A的數(shù)據(jù)目錄下面. APK B每次啟動(dòng)的時(shí)候讀取APK A下面的數(shù)據(jù)庫
判斷是否已經(jīng)登陸:
APK B中的代碼:
- friendContext = this.createPackageContext(
- "com.android.demo.a1",
- Context.CONTEXT_IGNORE_SECURITY);
通過A的package name 就可以得到A的 packagecontext
通過這個(gè)context就可以直接打開數(shù)據(jù)庫
D、sharedUserLabel
一個(gè)共享的用戶名,它只有在設(shè)置了sharedUserId屬性的前提下才會(huì)有意義
E、versionCode
是給設(shè)備程序識別版本(升級)用的必須是一個(gè)interger值代表app更新過多少次,比如第一版一般為1,之后若要更新版本就設(shè)置為2,3等等。。。
F、versionName
這個(gè)名稱是給用戶看的,你可以將你的APP版本號設(shè)置為1.1版,后續(xù)更新版本設(shè)置為1.2、2.0版本等等。。。
G、installLocation
安裝參數(shù),是Android2.2中的一個(gè)新特性,installLocation有三個(gè)值可以選擇:internalOnly、auto、preferExternal
選擇preferExternal,系統(tǒng)會(huì)優(yōu)先考慮將APK安裝到SD卡上(當(dāng)然最終用戶可以選擇為內(nèi)部ROM存儲上,如果SD存儲已滿,也會(huì)安裝到內(nèi)部存儲上)
選擇auto,系統(tǒng)將會(huì)根據(jù)存儲空間自己去適應(yīng)
選擇internalOnly是指必須安裝到內(nèi)部才能運(yùn)行
(注:需要進(jìn)行后臺類監(jiān)控的APP最好安裝在內(nèi)部,而一些較大的游戲APP最好安裝在SD卡上。現(xiàn)默認(rèn)為安裝在內(nèi)部,如果把APP安裝在SD卡上,首先得設(shè)置你的level為8,并且要配置android:installLocation這個(gè)參數(shù)的屬性為preferExternal)
2、第二層():屬性
一個(gè)AndroidManifest.xml中必須含有一個(gè)Application標(biāo)簽,這個(gè)標(biāo)簽聲明了每一個(gè)應(yīng)用程序的組件及其屬性(如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>
A、android:allowClearUserData('true' or 'false')
用戶是否能選擇自行清除數(shù)據(jù),默認(rèn)為true,程序管理器包含一個(gè)選擇允許用戶清除數(shù)據(jù)。當(dāng)為true時(shí),用戶可自己清理用戶數(shù)據(jù),反之亦然
B、android:allowTaskReparenting('true' or 'false')
是否允許activity更換從屬的任務(wù),比如從短信息任務(wù)切換到瀏覽器任務(wù)
C、android:backupAgent
這也是Android2.2中的一個(gè)新特性,設(shè)置該APP的備份,屬性值應(yīng)該是一個(gè)完整的類名,如com.project.TestCase,此屬性并沒有默認(rèn)值,并且類名必須得指定(就是個(gè)備份工具,將數(shù)據(jù)備份到云端的操作)
D、android:debuggable
這個(gè)從字面上就可以看出是什么作用的,當(dāng)設(shè)置為true時(shí),表明該APP在手機(jī)上可以被調(diào)試。默認(rèn)為false,在false的情況下調(diào)試該APP,就會(huì)報(bào)以下錯(cuò)誤:
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
此兩個(gè)屬性都是為許可提供的,均為字符串資源,當(dāng)用戶去看許可列表(android:label)或者某個(gè)許可的詳細(xì)信息(android:description)時(shí),這些字符串資源就可以顯示給用戶。label應(yīng)當(dāng)盡量簡短,之需要告知用戶該許可是在保護(hù)什么功能就行。而description可以用于具體描述獲取該許可的程序可以做哪些事情,實(shí)際上讓用戶可以知道如果他們同意程序獲取該權(quán)限的話,該程序可以做什么。我們通常用兩句話來描述許可,第一句描述該許可,第二句警告用戶如果批準(zhǔn)該權(quán)限會(huì)可能有什么不好的事情發(fā)生
F、android:enabled
Android系統(tǒng)是否能夠?qū)嵗搼?yīng)用程序的組件,如果為true,每個(gè)組件的enabled屬性決定那個(gè)組件是否可以被 enabled。如果為false,它覆蓋組件指定的值;所有組件都是disabled。
G、android:hasCode('true' or 'false')
表示此APP是否包含任何的代碼,默認(rèn)為true,若為false,則系統(tǒng)在運(yùn)行組件時(shí),不會(huì)去嘗試加載任何的APP代碼
一個(gè)應(yīng)用程序自身不會(huì)含有任何的代碼,除非內(nèi)置組件類,比如Activity類,此類使用了AliasActivity類,當(dāng)然這是個(gè)罕見的現(xiàn)象
(在Android2.3可以用標(biāo)準(zhǔn)C來開發(fā)應(yīng)用程序,可在androidManifest.xml中將此屬性設(shè)置為false,因?yàn)檫@個(gè)APP本身已經(jīng)不含有任何的JAVA代碼了)
H、android:icon
這個(gè)很簡單,就是聲明整個(gè)APP的圖標(biāo),圖片一般都放在drawable文件夾下
I、android:killAfterRestore
是否復(fù)位需要重啟
J、android:manageSpaceActivity
讓應(yīng)用手動(dòng)管理應(yīng)用的數(shù)據(jù)目錄
K、android:name
為應(yīng)用程序所實(shí)現(xiàn)的Application子類的全名。當(dāng)應(yīng)用程序進(jìn)程開始時(shí),該類在所有應(yīng)用程序組件之前被實(shí)例化。
若該類(比方androidMain類)是在聲明的package下,則可以直接聲明android:name="androidMain",但此類是在package下面的子包的話,就必須聲明為全路徑或android:name="package名稱.子包名成.androidMain"
L、android:permission
設(shè)置許可名,這個(gè)屬性若在上定義的話,是一個(gè)給應(yīng)用程序的所有組件設(shè)置許可的便捷方式,當(dāng)然它是被各組件設(shè)置的許可名所覆蓋的
M、android:presistent
該應(yīng)用程序是否應(yīng)該在任何時(shí)候都保持運(yùn)行狀態(tài),默認(rèn)為false。因?yàn)閼?yīng)用程序通常不應(yīng)該設(shè)置本標(biāo)識,持續(xù)模式僅僅應(yīng)該設(shè)置給某些系統(tǒng)應(yīng)用程序才是有意義的。
N、android:process
應(yīng)用程序運(yùn)行的進(jìn)程名,它的默認(rèn)值為元素里設(shè)置的包名,當(dāng)然每個(gè)組件都可以通過設(shè)置該屬性來覆蓋默認(rèn)值。如果你想兩個(gè)應(yīng)用程序共用一個(gè)進(jìn)程的話,你可以設(shè)置他們的android:process相同,但前提條件是他們共享一個(gè)用戶ID及被賦予了相同證書的時(shí)候
O、android:restoreAnyVersion
同樣也是android2.2的一個(gè)新特性,用來表明應(yīng)用是否準(zhǔn)備嘗試恢復(fù)所有的備份,甚至該備份是比當(dāng)前設(shè)備上更要新的版本,默認(rèn)是false
P、android:taskAffinity
擁有相同的affinity的Activity理論上屬于相同的Task,應(yīng)用程序默認(rèn)的affinity的名字是元素中設(shè)定的package名
Q、android:theme
是一個(gè)資源的風(fēng)格,它定義了一個(gè)默認(rèn)的主題風(fēng)格給所有的activity,當(dāng)然也可以在自己的theme里面去設(shè)置它,有點(diǎn)類似style。
3、第三層():屬性
- <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中重復(fù)的就不多闡述了)
A、android:alwaysRetainTaskState
是否保留狀態(tài)不變, 比如切換回home, 再從新打開,activity處于最后的狀態(tài)。比如一個(gè)瀏覽器擁有很多狀態(tài)(當(dāng)打開了多個(gè)TAB的時(shí)候),用戶并不希望丟失這些狀態(tài)時(shí),此時(shí)可將此屬性設(shè)置為true
B、android:clearTaskOnLaunch
比如 P 是 activity, Q 是被P 觸發(fā)的 activity, 然后返回Home, 重新啟動(dòng) P,是否顯示 Q
C、android:configChanges
當(dāng)配置list發(fā)生修改時(shí), 是否調(diào)用 onConfigurationChanged() 方法 比如 "locale|navigation|orientation". 這個(gè)我用過,主要用來看手機(jī)方向改變的. android手機(jī)在旋轉(zhuǎn)后,layout會(huì)重新布局, 如何做到呢?正常情況下. 如果手機(jī)旋轉(zhuǎn)了.當(dāng)前Activity后殺掉,然后根據(jù)方向重新加載這個(gè)Activity. 就會(huì)從onCreate開始重新加載.如果你設(shè)置了 這個(gè)選項(xiàng), 當(dāng)手機(jī)旋轉(zhuǎn)后,當(dāng)前Activity之后調(diào)用onConfigurationChanged() 方法. 而不跑onCreate方法等.
D、android:excludeFromRecents
是否可被顯示在最近打開的activity列表里,默認(rèn)是false
E、android:finishOnTaskLaunch
當(dāng)用戶重新啟動(dòng)這個(gè)任務(wù)的時(shí)候,是否關(guān)閉已打開的activity,默認(rèn)是false如果這個(gè)屬性和allowTaskReparenting都是true,這個(gè)屬性就是王牌。Activity的親和力將被忽略。該Activity已經(jīng)被摧毀并非re-parented
F、android:launchMode(Activity加載模式)
在多Activity開發(fā)中,有可能是自己應(yīng)用之間的Activity跳轉(zhuǎn),或者夾帶其他應(yīng)用的可復(fù)用Activity。可能會(huì)希望跳轉(zhuǎn)到原來某個(gè)Activity實(shí)例,而不是產(chǎn)生大量重復(fù)的Activity。這需要為Activity配置特定的加載模式,而不是使用默認(rèn)的加載模式
Activity有四種加載模式:
standard、singleTop、singleTask、singleInstance(其中前兩個(gè)是一組、后兩個(gè)是一組),默認(rèn)為standard
standard:就是intent將發(fā)送給新的實(shí)例,所以每次跳轉(zhuǎn)都會(huì)生成新的activity。
singleTop:也是發(fā)送新的實(shí)例,但不同standard的一點(diǎn)是,在請求的Activity正好位于棧頂時(shí)(配置成singleTop的Activity),不會(huì)構(gòu)造新的實(shí)例
singleTask:和后面的singleInstance都只創(chuàng)建一個(gè)實(shí)例,當(dāng)intent到來,需要?jiǎng)?chuàng)建設(shè)置為singleTask的Activity的時(shí)候,系統(tǒng)會(huì)檢查棧里面是否已經(jīng)有該Activity的實(shí)例。如果有直接將intent發(fā)送給它。
singleInstance:首先說明一下task這個(gè)概念,Task可以認(rèn)為是一個(gè)棧,可放入多個(gè)Activity。比如啟動(dòng)一個(gè)應(yīng)用,那么Android就創(chuàng)建了一個(gè)Task,然后啟動(dòng)這個(gè)應(yīng)用的入口Activity,那在它的界面上調(diào)用其他的Activity也只是在這個(gè)task里面。那如果在多個(gè)task中共享一個(gè)Activity的話怎么辦呢。舉個(gè)例來說,如果開啟一個(gè)導(dǎo)游服務(wù)類的應(yīng)用程序,里面有個(gè)Activity是開啟GOOGLE地圖的,當(dāng)按下home鍵退回到主菜單又啟動(dòng)GOOGLE地圖的應(yīng)用時(shí),顯示的就是剛才的地圖,實(shí)際上是同一個(gè)Activity,實(shí)際上這就引入了singleInstance。singleInstance模式就是將該Activity單獨(dú)放入一個(gè)棧中,這樣這個(gè)棧中只有這一個(gè)Activity,不同應(yīng)用的intent都由這個(gè)Activity接收和展示,這樣就做到了共享。當(dāng)然前提是這些應(yīng)用都沒有被銷毀,所以剛才是按下的HOME鍵,如果按下了返回鍵,則無效
G、android:multiprocess
是否允許多進(jìn)程,默認(rèn)是false
在實(shí)際開發(fā)中,CP有以下兩種用法:
1)和應(yīng)用在一個(gè)APK包里
這種情況下和應(yīng)用在同一進(jìn)程中。process name和uid都一樣。
2)單獨(dú)在一個(gè)APK包里。
這種情況下,如果在AndroidManifest.xml文件里聲明了和某個(gè)進(jìn)程同屬一個(gè)進(jìn)程,如:
- 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" />
這個(gè)里面通過android:sharedUserId="android.uid.phone"和android:process="com.android.phone"聲明了該CP是和phone進(jìn)程同屬一個(gè)進(jìn)程,擁有同樣的process name和uid.
如果沒有上述聲明,那么該CP是在獨(dú)立的進(jìn)程中,擁有屬于自己的process name和uid.
以上兩種用法可以總結(jié)為:
1)CP和某個(gè)進(jìn)程同屬一個(gè)進(jìn)程
這種情況下,當(dāng)該進(jìn)程啟動(dòng)時(shí),會(huì)搜索屬于該進(jìn)程的所有CP,并加載。
2)CP屬于獨(dú)立的一個(gè)進(jìn)程。
這種情況下,只有需要用到該CP時(shí),才會(huì)去加載。
那么,當(dāng)一個(gè)進(jìn)程想要操作一個(gè)CP時(shí),先需要獲取該CP的對象,系統(tǒng)是如何處理呢:
1)如果該CP屬于當(dāng)前主叫進(jìn)程,因?yàn)樵谶M(jìn)程啟動(dòng)時(shí)就已經(jīng)加載過了,所以系統(tǒng)會(huì)直接返回該CP的對象。
2)如果該CP不屬于當(dāng)前主叫進(jìn)程,那么系統(tǒng)會(huì)進(jìn)行相關(guān)處理(由ActivityManagerService進(jìn)行,以下簡稱為AMS):
所有已加載的CP信息都已保存在AMS中。當(dāng)需要獲取某個(gè)CP的對象時(shí),AMS會(huì)先判斷該CP是否已被加載
----如果已被加載,該CP和當(dāng)前主叫進(jìn)程不屬一個(gè)進(jìn)程,但是該CP設(shè)置了multiprocess的屬性(如上例中的android:multiprocess="true"),并且該CP屬于系統(tǒng)級CP,那么就在當(dāng)前主叫進(jìn)程內(nèi)部新生成該CP的對象。否則就需要通過IPC機(jī)制進(jìn)行調(diào)用。
----如果還未被加載,該CP和當(dāng)前主叫進(jìn)程不屬一個(gè)進(jìn)程,但是該CP設(shè)置了multiprocess的屬性(如上例中的android:multiprocess="true"),并且該CP屬于系統(tǒng)級CP,那么就在當(dāng)前主叫進(jìn)程內(nèi)部新生成該CP的對象。否則就需要先創(chuàng)建該CP所在的進(jìn)程,然后再通過IPC機(jī)制進(jìn)行調(diào)用。
H、android:noHistory
當(dāng)用戶從Activity上離開并且它在屏幕上不再可見時(shí),Activity是否從Activity stack中清除并結(jié)束。默認(rèn)是false。Activity不會(huì)留下歷史痕跡
I、android:screenOrientation
activity顯示的模式
默認(rèn)為unspecified:由系統(tǒng)自動(dòng)判斷顯示方向
landscape橫屏模式,寬度比高度大
portrait豎屏模式, 高度比寬度大
user模式,用戶當(dāng)前首選的方向
behind模式:和該Activity下面的那個(gè)Activity的方向一致(在Activity堆棧中的)
sensor模式:有物理的感應(yīng)器來決定。如果用戶旋轉(zhuǎn)設(shè)備這屏幕會(huì)橫豎屏切換
nosensor模式:忽略物理感應(yīng)器,這樣就不會(huì)隨著用戶旋轉(zhuǎn)設(shè)備而更改了
J、android:stateNotNeeded
activity被銷毀或者成功重啟時(shí)是否保存狀態(tài)
K、android:windowSoftInputMode
activity主窗口與軟鍵盤的交互模式,可以用來避免輸入法面板遮擋問題,Android1.5后的一個(gè)新特性。
這個(gè)屬性能影響兩件事情:
【A】當(dāng)有焦點(diǎn)產(chǎn)生時(shí),軟鍵盤是隱藏還是顯示
【B】是否減少活動(dòng)主窗口大小以便騰出空間放軟鍵盤
各值的含義:
【A】stateUnspecified:軟鍵盤的狀態(tài)并沒有指定,系統(tǒng)將選擇一個(gè)合適的狀態(tài)或依賴于主題的設(shè)置
【B】stateUnchanged:當(dāng)這個(gè)activity出現(xiàn)時(shí),軟鍵盤將一直保持在上一個(gè)activity里的狀態(tài),無論是隱藏還是顯示
【C】stateHidden:用戶選擇activity時(shí),軟鍵盤總是被隱藏
【D】stateAlwaysHidden:當(dāng)該Activity主窗口獲取焦點(diǎn)時(shí),軟鍵盤也總是被隱藏的
【E】stateVisible:軟鍵盤通常是可見的
【F】stateAlwaysVisible:用戶選擇activity時(shí),軟鍵盤總是顯示的狀態(tài)
【G】adjustUnspecified:默認(rèn)設(shè)置,通常由系統(tǒng)自行決定是隱藏還是顯示
【H】adjustResize:該Activity總是調(diào)整屏幕的大小以便留出軟鍵盤的空間
【I】adjustPan:當(dāng)前窗口的內(nèi)容將自動(dòng)移動(dòng)以便當(dāng)前焦點(diǎn)從不被鍵盤覆蓋和用戶能總是看到輸入內(nèi)容的部分
4、第四層()
結(jié)構(gòu)圖:
- <intent-filter android:icon="drawable resource"
- android:label="string resource"
- android:priority="integer" >
- <action />
- <category />
- <data />
- </intent-filter>
#p#
A、intent-filter屬性
android:priority(解釋:有序廣播主要是按照聲明的優(yōu)先級別,如A的級別高于B,那么,廣播先傳給A,再傳給B。優(yōu)先級別就是用設(shè)置priority屬性來確定,范圍是從-1000~1000,數(shù)越大優(yōu)先級別越高)Intent filter內(nèi)會(huì)設(shè)定的資料包括action,data與category三種。也就是說filter只會(huì)與intent里的這三種資料作對比動(dòng)作
B、action屬性
action很簡單,只有android:name這個(gè)屬性。常見的android:name值為android.intent.action.MAIN,表明此activity是作為應(yīng)用程序的入口。
有關(guān)android:name的具體值:
String ADD_SHORTCUT_ACTION 動(dòng)作:
在系統(tǒng)中添加一個(gè)快捷方式。
"android.intent.action.ADD_SHORTCUT" String ALL_APPS_ACTION 動(dòng)作:
列舉所有可用的應(yīng)用。
"android.intent.action.ALL_APPS" String ALTERNATIVE_CATEGORY 類別:
說明 activity 是用戶正在瀏覽的數(shù)據(jù)的一個(gè)可選操作。輸入:無。
"android.intent.category.ALTERNATIVE" String ANSWER_ACTION 動(dòng)作:
處理撥入的電話。
"android.intent.action.ANSWER" String BATTERY_CHANGED_ACTION 廣播:
充電狀態(tài),或者電池的電量發(fā)生變化。
"android.intent.action.BATTERY_CHANGED" String BOOT_COMPLETED_ACTION 廣播:
在系統(tǒng)啟動(dòng)后,這個(gè)動(dòng)作被廣播一次(只有一次)。
"android.intent.action.BOOT_COMPLETED" String BROWSABLE_CATEGORY 類別:
能夠被瀏覽器安全使用的 activities 必須支持這個(gè)類別。
"android.intent.category.BROWSABLE" String BUG_REPORT_ACTION 動(dòng)作:
顯示 activity 報(bào)告錯(cuò)誤。
"android.intent.action.BUG_REPORT" String CALL_ACTION 動(dòng)作:
撥打電話,被呼叫的聯(lián)系人在數(shù)據(jù)中指定。
"android.intent.action.CALL" String CALL_FORWARDING_STATE_CHANGED_ACTION 廣播:
語音電話的呼叫轉(zhuǎn)移狀態(tài)已經(jīng)改變。
"android.intent.action.CFF" String CLEAR_CREDENTIALS_ACTION 動(dòng)作:
清除登陸憑證 (credential)。
"android.intent.action.CLEAR_CREDENTIALS" String CONFIGURATION_CHANGED_ACTION 廣播:
設(shè)備的配置信息已經(jīng)改變。
String DATA_ACTIVITY_STATE_CHANGED_ACTION 廣播:
電話的數(shù)據(jù)活動(dòng)(data activity)狀態(tài)(即收發(fā)數(shù)據(jù)的狀態(tài))已經(jīng)改變。 "android.intent.action.DATA_ACTIVITY" String DATA_CONNECTION_STATE_CHANGED_ACTION 廣播:電話的數(shù)據(jù)連接狀態(tài)已經(jīng)改變。
"android.intent.action.DATA_STATE" String DATE_CHANGED_ACTION 廣播:
日期被改變。
"android.intent.action.DATE_CHANGED" String DEFAULT_ACTION 動(dòng)作:
和 VIEW_ACTION 相同,是在數(shù)據(jù)上執(zhí)行的標(biāo)準(zhǔn)動(dòng)作。
"android.intent.action.VIEW" String DEFAULT_CATEGORY 類別:
如果 activity 是對數(shù)據(jù)執(zhí)行確省動(dòng)作(點(diǎn)擊, center press)的一個(gè)選項(xiàng),需要設(shè)置這個(gè)類別。 "android.intent.category.DEFAULT" String DELETE_ACTION 動(dòng)作:
從容器中刪除給定的數(shù)據(jù)。
"android.intent.action.DELETE" String DEVELOPMENT_PREFERENCE_CATEGORY 類別:
說明 activity 是一個(gè)設(shè)置面板 (development preference panel). "android.intent.category.DEVELOPMENT_PREFERENCE" String DIAL_ACTION 動(dòng)作:
撥打數(shù)據(jù)中指定的電話號碼。
"android.intent.action.DIAL String EDIT_ACTION 動(dòng)作:
為制定的數(shù)據(jù)顯示可編輯界面。
"android.intent.action.EDIT" String EMBED_CATEGORY 類別:
能夠在上級(父)activity 中運(yùn)行。
"android.intent.category.EMBED" String EMERGENCY_DIAL_ACTION 動(dòng)作:
撥打緊急電話號碼。
"android.intent.action.EMERGENCY_DIAL" int FORWARD_RESULT_LAUNCH 啟動(dòng)標(biāo)記:
如果這個(gè)標(biāo)記被設(shè)置,而且被一個(gè)已經(jīng)存在的 activity 用來啟動(dòng)新的 activity,已有 activity 的回復(fù)目標(biāo) (reply target) 會(huì)被轉(zhuǎn)移給新的 activity。
16 0x00000010 String FOTA_CANCEL_ACTION 廣播:
取消所有被掛起的 (pending) 更新下載。
"android.server.checkin.FOTA_CANCEL" String FOTA_INSTALL_ACTION 廣播:
更新已經(jīng)被確認(rèn),馬上就要開始安裝。
"android.server.checkin.FOTA_INSTALL" String FOTA_READY_ACTION 廣播:
更新已經(jīng)被下載,可以開始安裝。
"android.server.checkin.FOTA_READY" String FOTA_RESTART_ACTION 廣播:
恢復(fù)已經(jīng)停止的更新下載。
"android.server.checkin.FOTA_RESTART" String FOTA_UPDATE_ACTION 廣播:
通過 OTA 下載并安裝操作系統(tǒng)更新。
"android.server.checkin.FOTA_UPDATE" String FRAMEWORK_INSTRUMENTATION_TEST_CATEGORY 類別:
作為代碼框架下儀器的測試。
"android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" String GADGET_CATEGORY 類別:這個(gè) activity 可以被嵌入宿主 activity (activity that is hosting gadgets)。 "android.intent.category.GADGET" String GET_CONTENT_ACTION 動(dòng)作:
讓用戶選擇數(shù)據(jù)并返回。
"android.intent.action.GET_CONTENT" String HOME_CATEGORY 類別:
主屏幕 (activity),設(shè)備啟動(dòng)后顯示的第一個(gè) activity。
"android.intent.category.HOME" String INSERT_ACTION 動(dòng)作:
在容器中插入一個(gè)空項(xiàng) (item)。
"android.intent.action.INSERT" String INTENT_EXTRA 附加數(shù)據(jù):
和PICK_ACTIVITY_ACTION 一起使用時(shí),說明用戶選擇的用來顯示的 activity;
和ADD_SHORTCUT_ACTION 一起使用的時(shí)候,描述要添加的快捷方式。 "android.intent.extra.INTENT" String LABEL_EXTRA 附加數(shù)據(jù):
大寫字母開頭的字符標(biāo)簽,和 ADD_SHORTCUT_ACTION 一起使用。
"android.intent.extra.LABEL" String LAUNCHER_CATEGORY 類別:
Activity 應(yīng)該被顯示在頂級的launcher 中。
"android.intent.category.LAUNCHER" String LOGIN_ACTION 動(dòng)作:
獲取登錄憑證。
"android.intent.action.LOGIN" String MAIN_ACTION 動(dòng)作:
作為主入口點(diǎn)啟動(dòng),不需要數(shù)據(jù)。
"android.intent.action.MAIN" String MEDIABUTTON_ACTION 廣播:
用戶按下了“Media Button”。
"android.intent.action.MEDIABUTTON" String MEDIA_BAD_REMOVAL_ACTION 廣播:
擴(kuò)展介質(zhì)(擴(kuò)展卡)已經(jīng)從 SD 卡插槽拔出,但是掛載點(diǎn) (mount point) 還沒解除 (unmount)。 "android.intent.action.MEDIA_BAD_REMOVAL" String MEDIA_EJECT_ACTION 廣播:
用戶想要移除擴(kuò)展介質(zhì)(拔掉擴(kuò)展卡)。
"android.intent.action.MEDIA_EJECT" String MEDIA_MOUNTED_ACTION 廣播:
擴(kuò)展介質(zhì)被插入,而且已經(jīng)被掛載。
"android.intent.action.MEDIA_MOUNTED" String MEDIA_REMOVED_ACTION 廣播:
擴(kuò)展介質(zhì)被移除。
"android.intent.action.MEDIA_REMOVED" String MEDIA_SCANNER_FINISHED_ACTION 廣播:
已經(jīng)掃描完介質(zhì)的一個(gè)目錄。
"android.intent.action.MEDIA_SCANNER_FINISHED" String MEDIA_SCANNER_STARTED_ACTION 廣播:
開始掃描介質(zhì)的一個(gè)目錄。
"android.intent.action.MEDIA_SCANNER_STARTED" String MEDIA_SHARED_ACTION 廣播:
擴(kuò)展介質(zhì)的掛載被解除 (unmount),因?yàn)樗呀?jīng)作為 USB 大容量存儲被共享。 "android.intent.action.MEDIA_SHARED" String MEDIA_UNMOUNTED_ACTION 廣播:
擴(kuò)展介質(zhì)存在,但是還沒有被掛載 (mount)。
"android.intent.action.MEDIA_UNMOUNTED" String MESSAGE_WAITING_STATE_CHANGED_ACTION 廣播:
電話的消息等待(語音郵件)狀態(tài)已經(jīng)改變。
"android.intent.action.MWI" int MULTIPLE_TASK_LAUNCH 啟動(dòng)標(biāo)記:
和 NEW_TASK_LAUNCH 聯(lián)合使用,禁止將已有的任務(wù)改變?yōu)榍熬叭蝿?wù) (foreground)。
8 0x00000008 String NETWORK_TICKLE_RECEIVED_ACTION 廣播:
設(shè)備收到了新的網(wǎng)絡(luò) "tickle" 通知。
"android.intent.action.NETWORK_TICKLE_RECEIVED" int NEW_TASK_LAUNCH 啟動(dòng)標(biāo)記:
設(shè)置以后,activity 將成為歷史堆棧中的第一個(gè)新任務(wù)(棧頂)。
4 0x00000004 int NO_HISTORY_LAUNCH 啟動(dòng)標(biāo)記:
設(shè)置以后,新的 activity 不會(huì)被保存在歷史堆棧中。
1 0x00000001 String PACKAGE_ADDED_ACTION 廣播:
設(shè)備上新安裝了一個(gè)應(yīng)用程序包。
"android.intent.action.PACKAGE_ADDED" String PACKAGE_REMOVED_ACTION 廣播:
設(shè)備上刪除了一個(gè)應(yīng)用程序包。
"android.intent.action.PACKAGE_REMOVED" String PHONE_STATE_CHANGED_ACTION 廣播:
電話狀態(tài)已經(jīng)改變。
"android.intent.action.PHONE_STATE" String PICK_ACTION 動(dòng)作:
從數(shù)據(jù)中選擇一個(gè)項(xiàng)目 (item),將被選中的項(xiàng)目返回。
"android.intent.action.PICK" String PICK_ACTIVITY_ACTION 動(dòng)作:
選擇一個(gè)activity,返回被選擇的 activity 的類(名)。
"android.intent.action.PICK_ACTIVITY" String PREFERENCE_CATEGORY 類別:
activity是一個(gè)設(shè)置面板 (preference panel)。
"android.intent.category.PREFERENCE" String PROVIDER_CHANGED_ACTION 廣播:
更新將要(真正)被安裝。
"android.intent.action.PROVIDER_CHANGED" String PROVISIONING_CHECK_ACTION 廣播:
要求 polling of provisioning service 下載最新的設(shè)置。 "android.intent.action.PROVISIONING_CHECK" String RUN_ACTION 動(dòng)作:
運(yùn)行數(shù)據(jù)(指定的應(yīng)用),無論它(應(yīng)用)是什么。
"android.intent.action.RUN" String SAMPLE_CODE_CATEGORY 類別:
作為一個(gè)示例代碼例子(不是普通用戶體驗(yàn)的一部分)。 "android.intent.category.SAMPLE_CODE" String SCREEN_OFF_ACTION 廣播:
屏幕被關(guān)閉。
"android.intent.action.SCREEN_OFF" String SCREEN_ON_ACTION 廣播:
屏幕已經(jīng)被打開。
"android.intent.action.SCREEN_ON" String SELECTED_ALTERNATIVE_CATEGORY 類別:
對于被用戶選中的數(shù)據(jù),activity 是它的一個(gè)可選操作。 "android.intent.category.SELECTED_ALTERNATIVE" String SENDTO_ACTION 動(dòng)作:
向 data 指定的接收者發(fā)送一個(gè)消息。
"android.intent.action.SENDTO" String SERVICE_STATE_CHANGED_ACTION 廣播:
電話服務(wù)的狀態(tài)已經(jīng)改變。
"android.intent.action.SERVICE_STATE" String SETTINGS_ACTION 動(dòng)作:
顯示系統(tǒng)設(shè)置。輸入:無。
"android.intent.action.SETTINGS" String SIGNAL_STRENGTH_CHANGED_ACTION 廣播:
電話的信號強(qiáng)度已經(jīng)改變。
"android.intent.action.SIG_STR" int SINGLE_TOP_LAUNCH 啟動(dòng)標(biāo)記:
設(shè)置以后,如果 activity 已經(jīng)啟動(dòng),而且位于歷史堆棧的頂端,將不再啟動(dòng)(不重新啟動(dòng)) activity。 2 0x00000002 String STATISTICS_REPORT_ACTION 廣播:
要求 receivers 報(bào)告自己的統(tǒng)計(jì)信息。
"android.intent.action.STATISTICS_REPORT" String STATISTICS_STATE_CHANGED_ACTION 廣播:
統(tǒng)計(jì)信息服務(wù)的狀態(tài)已經(jīng)改變。
"android.intent.action.STATISTICS_STATE_CHANGED" String SYNC_ACTION 動(dòng)作:
執(zhí)行數(shù)據(jù)同步。
"android.intent.action.SYNC" String TAB_CATEGORY 類別:
這個(gè) activity 應(yīng)該在 TabActivity 中作為一個(gè) tab 使用。
"android.intent.category.TAB" String TEMPLATE_EXTRA 附加數(shù)據(jù):
新記錄的初始化模板。
"android.intent.extra.TEMPLATE" String TEST_CATEGORY 類別:
作為測試目的使用,不是正常的用戶體驗(yàn)的一部分。
"android.intent.category.TEST" String TIMEZONE_CHANGED_ACTION 廣播:
時(shí)區(qū)已經(jīng)改變。
"android.intent.action.TIMEZONE_CHANGED" String TIME_CHANGED_ACTION 廣播:
時(shí)間已經(jīng)改變(重新設(shè)置)。
"android.intent.action.TIME_SET" String TIME_TICK_ACTION 廣播:
當(dāng)前時(shí)間已經(jīng)變化(正常的時(shí)間流逝)。
"android.intent.action.TIME_TICK" String UMS_CONNECTED_ACTION 廣播:
設(shè)備進(jìn)入 USB 大容量存儲模式。
"android.intent.action.UMS_CONNECTED" String UMS_DISCONNECTED_ACTION 廣播:
設(shè)備從 USB 大容量存儲模式退出。
"android.intent.action.UMS_DISCONNECTED" String UNIT_TEST_CATEGORY 類別:
應(yīng)該被用作單元測試(通過 test harness 運(yùn)行)。
"android.intent.category.UNIT_TEST" String VIEW_ACTION 動(dòng)作:
向用戶顯示數(shù)據(jù)。
"android.intent.action.VIEW" String WALLPAPER_CATEGORY 類別:
這個(gè) activity 能過為設(shè)備設(shè)置墻紙。
"android.intent.category.WALLPAPER" String WALLPAPER_CHANGED_ACTION 廣播:
系統(tǒng)的墻紙已經(jīng)改變。
"android.intent.action.WALLPAPER_CHANGED" String WALLPAPER_SETTINGS_ACTION 動(dòng)作:
顯示選擇墻紙的設(shè)置界面。輸入:無。
"android.intent.action.WALLPAPER_SETTINGS" String WEB_SEARCH_ACTION 動(dòng)作:
執(zhí)行 web 搜索。
"android.intent.action.WEB_SEARCH" String XMPP_CONNECTED_ACTION 廣播:
XMPP 連接已經(jīng)被建立。
"android.intent.action.XMPP_CONNECTED" String XMPP_DISCONNECTED_ACTION 廣播:
XMPP 連接已經(jīng)被斷開。
C、category屬性
category也只有android:name屬性。常見的android:name值android.intent.category.LAUNCHER(決定應(yīng)用程序是否顯示在程序列表里)
有關(guān)android:name具體的值:
CATEGORY_ALTERNATIVE
設(shè)置這個(gè)activity是否可以被認(rèn)為是用戶正在瀏覽的數(shù)據(jù)的一個(gè)可選擇的action
CATEGORY_APP_BROWSER
和ACTION_MAIN一起使用,用來啟動(dòng)瀏覽器應(yīng)用程序
CATEGORY_APP_CALCULATOR
和ACTION_MAIN一起使用,用來啟動(dòng)計(jì)算器應(yīng)用程序
CATEGORY_APP_CALENDAR
和ACTION_MAIN一起使用,用來啟動(dòng)日歷應(yīng)用程序
CATEGORY_APP_CONTACTS
和ACTION_MAIN一起使用,用來啟動(dòng)聯(lián)系人應(yīng)用程序
CATEGORY_APP_EMAIL
和ACTION_MAIN一起使用,用來啟動(dòng)郵件應(yīng)用程序
CATEGORY_APP_GALLERY
和ACTION_MAIN一起使用,用來啟動(dòng)圖庫應(yīng)用程序
CATEGORY_APP_MAPS
和ACTION_MAIN一起使用,用來啟動(dòng)地圖應(yīng)用程序
CATEGORY_APP_MARKET
這個(gè)activity允許用戶瀏覽和下載新的應(yīng)用程序
CATEGORY_APP_MESSAGING
和ACTION_MAIN一起使用,用來啟動(dòng)短信應(yīng)用程序
CATEGORY_APP_MUSIC
和ACTION_MAIN一起使用,用來啟動(dòng)音樂應(yīng)用程序
CATEGORY_BROWSABLE
能夠被瀏覽器安全調(diào)用的activity必須支持這個(gè)category
CATEGORY_DEFAULT
設(shè)置這個(gè)activity對于默認(rèn)的action是否是一個(gè)可選的
CATEGORY_EMBED
可以運(yùn)行在父activity容器內(nèi)
CATEGORY_HOME
主activity,當(dāng)應(yīng)用程序啟動(dòng)時(shí),它是第一個(gè)顯示的activity
CATEGORY_LAUNCHER
應(yīng)該在上層的啟動(dòng)列表里顯示
CATEGORY_MONKEY
這個(gè)activity可能被monkey或者其他的自動(dòng)測試工具執(zhí)行
CATEGORY_OPENABLE
用來指示一個(gè)GET_CONTENT意圖只希望ContentResolver.openInputStream能夠打開URI
CATEGORY_PREFERENCE
這個(gè)activity是一個(gè)選項(xiàng)卡
CATEGORY_SAMPLE_CODE
作為一個(gè)簡單的代碼示例使用(一般情況下不使用)
CATEGORY_SELECTED_ALTERNATIVE
設(shè)置這個(gè)activity是否可以被認(rèn)為是用戶當(dāng)前選擇的數(shù)據(jù)的一個(gè)可選擇的action
CATEGORY_TAB
想要在已有的TabActivity內(nèi)部作為一個(gè)Tab使用
CATEGORY_TEST
供測試使用(一般情況不使用)
CATEGORY_UNIT_TEST
聯(lián)合測試使用
- D、data屬性
- <data android:host="string"
- android:mimeType="string"
- android:path="string"
- android:pathPattern="string"
- android:pathPrefix="string"
- android:port="string"
- android:scheme="string"/>
- ```【1】每個(gè)<data>元素指定一個(gè)URI和數(shù)據(jù)類型(MIME類型)。
- 它有四個(gè)屬性scheme、host、port、path對應(yīng)于URI的每個(gè)部分:
- scheme://host:port/path
- scheme的值一般為"http",host為包名,port為端口號,path為具體地址。如:http://com.test.project:200/folder/etc
- 其中host和port合起來構(gòu)成URI的憑據(jù)(authority),如果host沒有指定,則port也會(huì)被忽略
- 要讓authority有意義,scheme也必須要指定。要讓path有意義,scheme+authority也必須要指定
- 【2】mimeType(指定數(shù)據(jù)類型),若mimeType為'Image',則會(huì)從content Provider的指定地址中獲取image類型的數(shù)據(jù)。還有'video'啥的,若設(shè)置為video/mp4,則表示在指定地址中獲取mp4格式的video文件
- 【3】而pathPattern和PathPrefix主要是為了格式化path所使用的
- ```java
- 5、第四層<meta-data>
- <meta-data android:name="string"
- android:resource="resource specification"
- android:value="string"/>
- ```這是該元素的基本結(jié)構(gòu).可以包含在<activity> <activity-alias> <service> <receiver>四個(gè)元素中。
- android:name
- 解釋:元數(shù)據(jù)項(xiàng)的名字,為了保證這個(gè)名字是唯一的,采用java風(fēng)格的命名規(guī)范,
- 如com.woody.project.fried
- android:resource
- 解釋:資源的一個(gè)引用,指定給這個(gè)項(xiàng)的值是該資源的id。該id可以通過方法Bundle.getInt()來從meta-data中找到。
- android:value
- 解釋:指定給這一項(xiàng)的值。可以作為值來指定的數(shù)據(jù)類型并且組件用來找回那些值的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創(chuàng)建快捷方式的,如下實(shí)例:
- <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是指向?qū)?yīng)快捷方式的activity,如上述的shortcut(此Activity名)
- android:label是指快捷方式的名稱,而快捷方式的圖標(biāo)默認(rèn)是給定的application圖標(biāo)
- ```java
- 7、第三層<service>
- ```【1】service與activity同級,與activity不同的是,它不能自己啟動(dòng)的,運(yùn)行在后臺的程序,如果我們退出應(yīng)用時(shí),Service進(jìn)程并沒有結(jié)束,它仍然在后臺運(yùn)行。比如聽音樂,網(wǎng)絡(luò)下載數(shù)據(jù)等,都是由service運(yùn)行的
- 【2】service生命周期:Service只繼承了onCreate(),onStart(),onDestroy()三個(gè)方法,第一次啟動(dòng)Service時(shí),先后調(diào)用了onCreate(),onStart()這兩個(gè)方法,當(dāng)停止Service時(shí),則執(zhí)行onDestroy()方法,如果Service已經(jīng)啟動(dòng)了,當(dāng)我們再次啟動(dòng)Service時(shí),不會(huì)在執(zhí)行onCreate()方法,而是直接執(zhí)行onStart()方法
- 【3】service與activity間的通信
- Service后端的數(shù)據(jù)最終還是要呈現(xiàn)在前端Activity之上的,因?yàn)閱?dòng)Service時(shí),系統(tǒng)會(huì)重新開啟一個(gè)新的進(jìn)程,這就涉及到不同進(jìn)程間通信的問題了(AIDL),Activity與service間的通信主要用IBinder負(fù)責(zé)。
- 【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標(biāo)簽內(nèi)的屬性之前已有描述,在此不重復(fù)了~
- 8、第三層<receiver>
receiver的屬性與service一樣,這里就不顯示了
BroadcastReceiver:用于發(fā)送廣播,broadcast是在應(yīng)用程序之間傳輸信息的一種機(jī)制,而BroadcastReceiver是對發(fā)送出來的 Broadcast進(jìn)行過濾接受并響應(yīng)的一類組件Android BroadcastReceiver 簡介
在 Android 中使用 Activity, Service, Broadcast, BroadcastReceiver
活動(dòng)(Activity) - 用于表現(xiàn)功能
服務(wù)(Service) - 相當(dāng)于后臺運(yùn)行的 Activity
廣播(Broadcast) - 用于發(fā)送廣播
廣播接收器(BroadcastReceiver) - 用于接收廣播
Intent - 用于連接以上各個(gè)組件,并在其間傳遞消息
BroadcastReceiver
在Android中,Broadcast是一種廣泛運(yùn)用的在應(yīng)用程序之間傳輸信息的機(jī)制。而BroadcastReceiver是對發(fā)送出來的 Broadcast進(jìn)行過濾接受并響應(yīng)的一類組件。下面將詳細(xì)的闡述如何發(fā)送Broadcast和使用BroadcastReceiver過 濾接收的過程:
首先在需要發(fā)送信息的地方,把要發(fā)送的信息和用于過濾的信息(如Action、Category)裝入一個(gè)Intent對象,然后通過調(diào)用 Context.sendBroadcast()、sendOrderBroadcast()或sendStickyBroadcast()方法,把 Intent對象以廣播方式發(fā)送出去。
當(dāng)Intent發(fā)送以后,所有已經(jīng)注冊的BroadcastReceiver會(huì)檢查注冊時(shí)的IntentFilter是否與發(fā)送的Intent相匹配,若 匹配則就會(huì)調(diào)用BroadcastReceiver的onReceive()方法。所以當(dāng)我們定義一個(gè)BroadcastReceiver的時(shí)候,都需要 實(shí)現(xiàn)onReceive()方法。
注冊BroadcastReceiver有兩種方式:
一種方式是,靜態(tài)的在AndroidManifest.xml中用標(biāo)簽生命注冊,并在標(biāo)簽內(nèi)用標(biāo)簽設(shè)置過濾器。
另一種方式是,動(dòng)態(tài)的在代碼中先定義并設(shè)置好一個(gè) IntentFilter對象,然后在需要注冊的地方調(diào) Context.registerReceiver()方法,如果取消時(shí)就調(diào)用Context.unregisterReceiver()方法。如果用動(dòng) 態(tài)方式注冊的BroadcastReceiver的Context對象被銷毀時(shí),BroadcastReceiver也就自動(dòng)取消注冊了。
另外,若在使用sendBroadcast()的方法是指定了接收權(quán)限,則只有在AndroidManifest.xml中用標(biāo)簽聲明了擁有此權(quán)限的BroascastReceiver才會(huì)有可能接收到發(fā)送來的Broadcast。
同樣,若在注冊BroadcastReceiver時(shí)指定了可接收的Broadcast的權(quán)限,則只有在包內(nèi)的AndroidManifest.xml中 用標(biāo)簽聲明了,擁有此權(quán)限的Context對象所發(fā)送的Broadcast才能被這個(gè) BroadcastReceiver所接收。
動(dòng)態(tài)注冊:
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(String);--為 BroadcastReceiver指定action,使之用于接收同action的廣播 registerReceiver(BroadcastReceiver,intentFilter);
一般:在onStart中注冊,onStop中取消unregisterReceiver
發(fā)送廣播消息:extends Service
指定廣播目標(biāo)Action:Intent Intent = new Intent(action-String)
--指定了此action的receiver會(huì)接收此廣播
需傳遞參數(shù)(可選) putExtra();
發(fā)送:sendBroadcast(Intent);
- 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(數(shù)據(jù)存儲)
- 【1】android:authorities:
- 標(biāo)識這個(gè)ContentProvider,調(diào)用者可以根據(jù)這個(gè)標(biāo)識來找到它
- 【2】android:grantUriPermission:
- 對某個(gè)URI授予的權(quán)限
- 【3】android: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以后的新特性,支持多屏幕機(jī)制各屬性含義:這四個(gè)屬性,是否支持大屏,是否支持中屏,是否支持小屏,是否支持多種不同密度
- ```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"] />
- ```這兩者都是在描述應(yīng)用所需要的硬件和軟件特性,以便防止應(yīng)用在沒有這些特性的設(shè)備上安裝。
- ```java
- 13、第二層<uses-sdk />
- <uses-sdk android:minSdkVersion="integer"
- android:targetSdkVersion="integer"
- android:maxSdkVersion="integer"/>
- ```描述應(yīng)用所需的api level,就是版本,目前是android 2.2 = 8,android2.1 = 7,android1.6 = 4,android1.5=3在此屬性中可以指定支持的最小版本,目標(biāo)版本以及最大版本
- ```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"/>
- ``` 定義一些用于探測和分析應(yīng)用性能等等相關(guān)的類,可以監(jiān)控程序。在各個(gè)應(yīng)用程序的組件之前instrumentation類被實(shí)例化
- android:functionalTest(解釋:instrumentation類是否能運(yùn)行一個(gè)功能測試,默認(rèn)為false)
- ```java
- 15、<permission>、<uses-permission>、<permission-tree />、<permission-group />區(qū)別
最常用的當(dāng)屬,當(dāng)我們需要獲取某個(gè)權(quán)限的時(shí)候就必須在我們的manifest文件中聲明,此與同級,具體權(quán)限列表請看此處
通常情況下我們不需要為自己的應(yīng)用程序聲明某個(gè)權(quán)限,除非你提供了供其他應(yīng)用程序調(diào)用的代碼或者數(shù)據(jù)。這個(gè)時(shí)候你才需要使用 這個(gè)標(biāo)簽。很顯然這個(gè)標(biāo)簽可以讓我們聲明自己的權(quán)限。比如:
- <permission android:name="com.teleca.project.MY_SECURITY" . . . />
- ```那么在activity中就可以聲明該自定義權(quán)限了,如:
- ```java
- <application . . .>
- <activity android:name="XXX" . . . >
- android:permission="com.teleca.project.MY_SECURITY"> </activity>
- </application>
當(dāng)然自己聲明的permission也不能隨意的使用,還是需要使用來聲明你需要該權(quán)限
就是聲明一個(gè)標(biāo)簽,該標(biāo)簽代表了一組permissions,而是為一組permissions聲明了一個(gè)namespace。這兩個(gè)標(biāo)簽可以看之前的系列文章。