說明:
在Unity開發(fā)移動平臺相關應用程序時,難免會涉及到一些必要的插件(如:社會化分享插件ShareSDK、Umeng;增強現(xiàn)實開發(fā)Vufoia;掃描二維碼插件等一些列),每一種插件分開使用時特別好用,無需特殊配置,使用Example案例就能快速上手使用。然后,當有時同時需要多個插件同時使用時,由于每個插件都包含有自身的Androidmanifest.xml文件,必然會出現(xiàn)的問題就是后面導入到Unity工程的Androidmanifest.xml文件會自動重命名為Androidmanifest 1.xml,Androidmanifest 2.xml。。。由于同一個Android程序中,僅能識別一個“Androidmanifest”文件,后面導入并重命名的Androidmanifest.xml文件將無法識別到,也就導致了很多開發(fā)者在使用多個插件時只有一個插件功能可使用的情況。
掌握必要的Androidmanifest.xml內(nèi)容:
AndroidManifest.xml文件是Android系統(tǒng)重要文件,主要涉及到權限申請及定義配置文件,通過它可以向系統(tǒng)預先定義和申請應用程序運行所需要的權限。
Androidmanifest.xml的主要用途:
AndroidManifest.xml主要包含以下功能:
- 描述應用程序的相關信息——包名、命名空間、版本號、名稱等
- 聲明應用程序所必須具備的權限——如獲取相機權限、WiFi權限等
- 聲明程序的入口
- 指定應用程序所使用的SDK版本
- 指定應用程序會使用到的庫文件
- 設定應用程序的硬件或一些屬性——屏幕大小、是否支持旋轉(zhuǎn)屏幕等
Androidmanifest.xml的結(jié)構
- <pre name="code" class="html"><?xmlversionxmlversion="1.0"encoding="utf-8"?>
-
- <!-- 基本配置 -->
- <manifest
- android:versionName="1.0"
- android:versionCode="1"
- package="com.unity3d.player"
- xmlns:android="http://schemas.android.com/apk/res/android">
- <!-- 應用程序配置 -->
- <application>
- <!-- 活動項 -->
- <activity>
- <intent-filter>
- <action/>
- <category/>
- </intent-filter>
- </activity>
- <!-- 后端活動項 -->
- <service>
- <intent-filter></intent-filter>
- <meta-data/>
- </service>
- <!--發(fā)送廣播-->
- <receiver>
- <intent-filter></intent-filter>
- <meta-data/>
- </receiver>
- <!--使用的庫文件-->
- <uses-library/>
- </application>
-
- <!--權限配置-->
- <uses-permission/>
- <permission/>
-
- <!--用于監(jiān)控-->
- <instrumentation/>
- <!--SDK版本-->
- <uses-sdk/>
- <!---軟硬件描述-->
- <uses-configuration/>
- <uses-feature/>
- <!--屏幕設置-->
- <supports-screens/>
- </manifest>
Androidmanifest.xml的結(jié)構——(<Manifest>):(屬性)
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.Bruce.Xu.test"
- android:sharedUserId="string"
- android:sharedUserLabel="string resource"
- android:versionCode="integer"
- android:versionName="string"
- android:installLocation=["auto" | "internalOnly" | "preferExternal"] >
- </manifest>
- xmlns:android——定義android命名空間,一般為http://schemas.android.com/apk/res/android,這樣使得Android中各種標準屬性能在文件中使用,提供了大部分元素中的數(shù)據(jù)。
- package——指定本應用內(nèi)java主程序包的包名,它也是一個應用進程的默認名稱
- sharedUserId——表明數(shù)據(jù)權限,因為默認情況下,Android給每個APK分配一個唯一的UserID,所以是默認禁止不同APK訪問共享數(shù)據(jù)的。若要共享數(shù)據(jù),第一可以采用Share Preference方法,第二種就可以采用sharedUserId了,將不同APK的sharedUserId都設為一樣,則這些APK之間就可以互相共享數(shù)據(jù)了。
- sharedUserLabel——一個共享的用戶名,它只有在設置了sharedUserId屬性的前提下才會有意義
- versionCode——是給設備程序識別版本(升級)用的必須是一個interger值代表app更新過多少次
- versionName——顯示出來的版本名稱
- installLocation——安裝參數(shù),installLocation有三個值:internalOnly、auto、preferExternal
- 選擇preferExternal,系統(tǒng)會優(yōu)先考慮將APK安裝到SD卡上(當然最終用戶可以選擇為內(nèi)部ROM存儲上,如果SD存儲已滿,也會安裝到內(nèi)部存儲上)
- 選擇auto,系統(tǒng)將會根據(jù)存儲空間自己去適應
- 選擇internalOnly是指必須安裝到內(nèi)部才能運行
Androidmanifest.xml的結(jié)構——(<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:allowClearUserData('true' or 'false')——用戶是否能選擇自行清除數(shù)據(jù),默認為true,程序管理器包含一個選擇允許用戶清除數(shù)據(jù)。當為true時,用戶可自己清理用戶數(shù)據(jù),反之亦然
- android:allowTaskReparenting('true' or 'false')——是否允許activity更換從屬的任務,比如從短信息任務切換到瀏覽器任務
- android:backupAgent——這也是Android2.2中的一個新特性,設置該APP的備份,屬性值應該是一個完整的類名,如com.project.TestCase,此屬性并沒有默認值,并且類名必須得指定(就是個備份工具,將數(shù)據(jù)備份到云端的操作)
- android:debuggable——這個從字面上就可以看出是什么作用的,當設置為true時,表明該APP在手機上可以被調(diào)試。默認為false,在false的情況下調(diào)試該APP,就會報以下錯誤:
- android:description/android:label——此兩個屬性都是為許可提供的,均為字符串資源,當用戶去看許可列表(android:label)或者某個許可的詳細信息(android:description)時,這些字符串資源就可以顯示給用戶。label應當盡量簡短,之需要告知用戶該許可是在保護什么功能就行。而description可以用于具體描述獲取該許可的程序可以做哪些事情,實際上讓用戶可以知道如果他們同意程序獲取該權限的話,該程序可以做什么。我們通常用兩句話來描述許可,第一句描述該許可,第二句警告用戶如果批準該權限會可能有什么不好的事情發(fā)生
- android:enabled——Android系統(tǒng)是否能夠?qū)嵗搼贸绦虻慕M件,如果為true,每個組件的enabled屬性決定那個組件是否可以被 enabled。如果為false,它覆蓋組件指定的值;所有組件都是disabled。
- android:hasCode('true' or 'false')——表示此APP是否包含任何的代碼,默認為true,若為false,則系統(tǒng)在運行組件時,不會去嘗試加載任何的APP代碼
- 一個應用程序自身不會含有任何的代碼,除非內(nèi)置組件類,比如Activity類,此類使用了AliasActivity類,當然這是個罕見的現(xiàn)象
- (在Android2.3可以用標準C來開發(fā)應用程序,可在androidManifest.xml中將此屬性設置為false,因為這個APP本身已經(jīng)不含有任何的JAVA代碼了)
- android:icon——這個很簡單,就是聲明整個APP的圖標,圖片一般都放在drawable文件夾下
- android:name——為應用程序所實現(xiàn)的Application子類的全名。當應用程序進程開始時,該類在所有應用程序組件之前被實例化。
- android:permission——設置許可名,這個屬性若在<application>上定義的話,是一個給應用程序的所有組件設置許可的便捷方式,當然它是被各組件設置的許可名所覆蓋的
- android:presistent——該應用程序是否應該在任何時候都保持運行狀態(tài),默認為false。因為應用程序通常不應該設置本標識,持續(xù)模式僅僅應該設置給某些系統(tǒng)應用程序才是有意義的。
- android:process——應用程序運行的進程名,它的默認值為<manifest>元素里設置的包名,當然每個組件都可以通過設置該屬性來覆蓋默認值。如果你想兩個應用程序共用一個進程的話,你可以設置他們的android:process相同,但前提條件是他們共享一個用戶ID及被賦予了相同證書的時候
- android:restoreAnyVersion——同樣也是android2.2的一個新特性,用來表明應用是否準備嘗試恢復所有的備份,甚至該備份是比當前設備上更要新的版本,默認是false
- android:taskAffinity——擁有相同的affinity的Activity理論上屬于相同的Task,應用程序默認的affinity的名字是<manifest>元素中設定的package名
Androidmanifest.xml的結(jié)構——(<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>
- android:alwaysRetainTaskState——是否保留狀態(tài)不變, 比如切換回home, 再從新打開,activity處于最后的狀態(tài)。比如一個瀏覽器擁有很多狀態(tài)(當打開了多個TAB的時候),用戶并不希望丟失這些狀態(tài)時,此時可將此屬性設置為true
- android:clearTaskOnLaunch——比如 P 是 activity, Q 是被P 觸發(fā)的 activity, 然后返回Home, 重新啟動 P,是否顯示 Q
- android:configChanges——當配置list發(fā)生修改時, 是否調(diào)用 onConfigurationChanged() 方法 比如 "locale|navigation|orientation". 這個我用過,主要用來看手機方向改變的. android手機在旋轉(zhuǎn)后,layout會重新布局, 如何做到呢?正常情況下. 如果手機旋轉(zhuǎn)了.當前Activity后殺掉,然后根據(jù)方向重新加載這個Activity. 就會從onCreate開始重新加載.如果你設置了 這個選項, 當手機旋轉(zhuǎn)后,當前Activity之后調(diào)用onConfigurationChanged() 方法. 而不跑onCreate方法等.
- android:excludeFromRecents——是否可被顯示在最近打開的activity列表里,默認是false
- android:finishOnTaskLaunch——當用戶重新啟動這個任務的時候,是否關閉已打開的activity,默認是false。如果這個屬性和allowTaskReparenting都是true,這個屬性就是王牌。Activity的親和力將被忽略。該Activity已經(jīng)被摧毀并非re-parented
- android:launchMode(Activity加載模式)——在多Activity開發(fā)中,有可能是自己應用之間的Activity跳轉(zhuǎn),或者夾帶其他應用的可復用Activity??赡軙MD(zhuǎn)到原來某個Activity實例,而不是產(chǎn)生大量重復的Activity。這需要為Activity配置特定的加載模式,而不是使用默認的加載模式
- Activity有四種加載模式:
- standard、singleTop、singleTask、singleInstance(其中前兩個是一組、后兩個是一組),默認為standard
- standard:就是intent將發(fā)送給新的實例,所以每次跳轉(zhuǎn)都會生成新的activity。
- singleTop:也是發(fā)送新的實例,但不同standard的一點是,在請求的Activity正好位于棧頂時(配置成singleTop的Activity),不會構造新的實例
- singleTask:和后面的singleInstance都只創(chuàng)建一個實例,當intent到來,需要創(chuàng)建設置為singleTask的Activity的時候,系統(tǒng)會檢查棧里面是否已經(jīng)有該Activity的實例。如果有直接將intent發(fā)送給它。
- singleInstance:首先說明一下task這個概念,Task可以認為是一個棧,可放入多個Activity。比如啟動一個應用,那么Android就創(chuàng)建了一個Task,然后啟動這個應用的入口Activity,那在它的界面上調(diào)用其他的Activity也只是在這個task里面。那如果在多個task中共享一個Activity的話怎么辦呢。舉個例來說,如果開啟一個導游服務類的應用程序,里面有個Activity是開啟GOOGLE地圖的,當按下home鍵退回到主菜單又啟動GOOGLE地圖的應用時,顯示的就是剛才的地圖,實際上是同一個Activity,實際上這就引入了singleInstance。singleInstance模式就是將該Activity單獨放入一個棧中,這樣這個棧中只有這一個Activity,不同應用的intent都由這個Activity接收和展示,這樣就做到了共享。當然前提是這些應用都沒有被銷毀,所以剛才是按下的HOME鍵,如果按下了返回鍵,則無效
- android:multiprocess——是否允許多進程,默認是false
- android:noHistory——當用戶從Activity上離開并且它在屏幕上不再可見時,Activity是否從Activity stack中清除并結(jié)束。默認是false。Activity不會留下歷史痕跡
- android:screenOrientation——activity顯示的模式
- 默認為unspecified:由系統(tǒng)自動判斷顯示方向
- landscape橫屏模式,寬度比高度大
- portrait豎屏模式, 高度比寬度大
- user模式,用戶當前首選的方向
- behind模式:和該Activity下面的那個Activity的方向一致(在Activity堆棧中的)
- sensor模式:有物理的感應器來決定。如果用戶旋轉(zhuǎn)設備這屏幕會橫豎屏切換
- nosensor模式:忽略物理感應器,這樣就不會隨著用戶旋轉(zhuǎn)設備而更改了
- android:stateNotNeeded——activity被銷毀或者成功重啟時是否保存狀態(tài)
- android:windowSoftInputMode——activity主窗口與軟鍵盤的交互模式,可以用來避免輸入法面板遮擋問題,Android1.5后的一個新特性。
- 這個屬性能影響兩件事情:
- 【A】當有焦點產(chǎn)生時,軟鍵盤是隱藏還是顯示
- 【B】是否減少活動主窗口大小以便騰出空間放軟鍵盤
- 各值的含義:
- 【A】stateUnspecified:軟鍵盤的狀態(tài)并沒有指定,系統(tǒng)將選擇一個合適的狀態(tài)或依賴于主題的設置
- 【B】stateUnchanged:當這個activity出現(xiàn)時,軟鍵盤將一直保持在上一個activity里的狀態(tài),無論是隱藏還是顯示
- 【C】stateHidden:用戶選擇activity時,軟鍵盤總是被隱藏
- 【D】stateAlwaysHidden:當該Activity主窗口獲取焦點時,軟鍵盤也總是被隱藏的
- 【E】stateVisible:軟鍵盤通常是可見的
- 【F】stateAlwaysVisible:用戶選擇activity時,軟鍵盤總是顯示的狀態(tài)
- 【G】adjustUnspecified:默認設置,通常由系統(tǒng)自行決定是隱藏還是顯示
- 【H】adjustResize:該Activity總是調(diào)整屏幕的大小以便留出軟鍵盤的空間
- 【I】adjustPan:當前窗口的內(nèi)容將自動移動以便當前焦點從不被鍵盤覆蓋和用戶能總是看到輸入內(nèi)容的部分
Androidmanifest.xml的結(jié)構——(<intent-filter>)
- <intent-filter android:icon="drawable resource"
- android:label="string resource"
- android:priority="integer" >
- <action />
- <category />
- <data />
-
- </intent-filter>
- android:priority(解釋:有序廣播主要是按照聲明的優(yōu)先級別,如A的級別高于B,那么,廣播先傳給A,再傳給B。優(yōu)先級別就是用設置priority屬性來確定,范圍是從-1000~1000,數(shù)越大優(yōu)先級別越高)
- Intent filter內(nèi)會設定的資料包括action,data與category三種。也就是說filter只會與intent里的這三種資料作對比動作
- action屬性:
- action很簡單,只有android:name這個屬性。常見的android:name值為android.intent.action.MAIN,表明此activity是作為應用程序的入口。有關android:name具體有哪些值,可參照這個網(wǎng)址:http://hi.baidu.com/linghtway/blog/item/83713cc1c2d053170ff477a7.html
- category屬性:
- category也只有android:name屬性。常見的android:name值為android.intent.category.LAUNCHER(決定應用程序是否顯示在程序列表里)
Androidmanifest.xml的結(jié)構——data屬性
- <data android:host="string"
- android:mimeType="string"
- android:path="string"
- android:pathPattern="string"
- android:pathPrefix="string"
- android:port="string"
- android:scheme="string"/>
- 每個<data>元素指定一個URI和數(shù)據(jù)類型(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的憑據(jù)(authority),如果host沒有指定,則port也會被忽略
- 要讓authority有意義,scheme也必須要指定。要讓path有意義,scheme+authority也必須要指定
- mimeType(指定數(shù)據(jù)類型),若mimeType為'Image',則會從content Provider的指定地址中獲取image類型的數(shù)據(jù)。還有'video'啥的,若設置為video/mp4,則表示在指定地址中獲取mp4格式的video文件
- 而pathPattern和PathPrefix主要是為了格式化path所使用的
Androidmanifest.xml的結(jié)構——<meta-data>
- <meta-data android:name="string"
- android:resource="resource specification"
- android:value="string"/>
這是該元素的基本結(jié)構.可以包含在<activity> <activity-alias> <service> <receiver>四個元素中。
- android:name(解釋:元數(shù)據(jù)項的名字,為了保證這個名字是唯一的,采用java風格的命名規(guī)范,如com.woody.project.fried)
- android:resource(解釋:資源的一個引用,指定給這個項的值是該資源的id。該id可以通過方法Bundle.getInt()來從meta-data中找到。)
- android:value(解釋:指定給這一項的值??梢宰鳛橹祦碇付ǖ臄?shù)據(jù)類型并且組件用來找回那些值的Bundle方法:[getString],[getInt],[getFloat],[getString],[getBoolean])
Androidmanifest.xml的結(jié)構——<service>
- 【1】service與activity同級,與activity不同的是,它不能自己啟動的,運行在后臺的程序,如果我們退出應用時,Service進程并沒有結(jié)束,它仍然在后臺運行。比如聽音樂,網(wǎng)絡下載數(shù)據(jù)等,都是由service運行的
- 【2】service生命周期:Service只繼承了onCreate(),onStart(),onDestroy()三個方法,第一次啟動Service時,先后調(diào)用了onCreate(),onStart()這兩個方法,當停止Service時,則執(zhí)行onDestroy()方法,如果Service已經(jīng)啟動了,當我們再次啟動Service時,不會在執(zhí)行onCreate()方法,而是直接執(zhí)行onStart()方法
- 【3】service與activity間的通信
- Service后端的數(shù)據(jù)最終還是要呈現(xiàn)在前端Activity之上的,因為啟動Service時,系統(tǒng)會重新開啟一個新的進程,這就涉及到不同進程間通信的問題了(AIDL),Activity與service間的通信主要用IBinder負責。
Androidmanifest.xml的結(jié)構——<receiver>
- receiver的屬性與service一樣
- BroadcastReceiver:用于發(fā)送廣播,broadcast是在應用程序之間傳輸信息的一種機制,而BroadcastReceiver是對發(fā)送出來的 Broadcast進行過濾接受并響應的一類組件
Androidmanifest.xml的結(jié)構——<uses-library>
用戶庫,可自定義。所有android的包都可以引用
本站僅提供存儲服務,所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內(nèi)容,請
點擊舉報。