Unity與Android——Androidmanifest.xml文件的介紹

在Unity開發移動平臺相關應用程序時,難免會涉及到一些必要的插件(如:社會化分享插件ShareSDK、Umeng;增強現實開發Vufoia;掃描二維碼插件等一些列),每一種插件分開使用時特別好用,無需特殊配置,使用Example案例就能快速上手使用。然後,當有時同時需要多個插件同時使用時,由於每個插件都包含有自身的Androidmanifest.xml文件,必然會出現的問題就是後面導入到Unity工程的Androidmanifest.xml文件會自動重命名爲Androidmanifest 1.xml,Androidmanifest 2.xml。。。由於同一個Android程序中,僅能識別一個“Androidmanifest”文件,後面導入並重命名的Androidmanifest.xml文件將無法識別到,也就導致了很多開發者在使用多個插件時只有一個插件功能可使用的情況。

掌握必要的Androidmanifest.xml內容:
Androidmanifest.xml介紹:
AndroidManifest.xml文件是Android系統重要文件,主要涉及到權限申請及定義配置文件,通過它可以向系統預先定義和申請應用程序運行所需要的權限。
Androidmanifest.xml的主要用途:
AndroidManifest.xml主要包含以下功能:
描述應用程序的相關信息——包名、命名空間、版本號、名稱等
聲明應用程序所必須具備的權限——如獲取相機權限、WiFi權限等
聲明程序的入口
指定應用程序所使用的SDK版本
指定應用程序會使用到的庫文件
設定應用程序的硬件或一些屬性——屏幕大小、是否支持旋轉屏幕等
Androidmanifest.xml的詳解:
Androidmanifest.xml的結構
<pre name="code" class="html"><?xmlversion="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>
       <!--發送廣播-->
       <receiver>
           <intent-filter></intent-filter>
           <meta-data/>
       </receiver>
        <!--使用的庫文件-->
       <uses-library/>
    </application>
    
    <!--權限配置-->
    <uses-permission/>
    <permission/>
 
    <!--用於監控-->
    <instrumentation/>
    <!--SDK版本-->
    <uses-sdk/>
    <!---軟硬件描述-->
    <uses-configuration/> 
    <uses-feature/> 
    <!--屏幕設置-->
    <supports-screens/>
</manifest>
Androidmanifest.xml的結構——(<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中各種標準屬性能在文件中使用,提供了大部分元素中的數據。
package——指定本應用內java主程序包的包名,它也是一個應用進程的默認名稱
sharedUserId——表明數據權限,因爲默認情況下,Android給每個APK分配一個唯一的UserID,所以是默認禁止不同APK訪問共享數據的。若要共享數據,第一可以採用Share Preference方法,第二種就可以採用sharedUserId了,將不同APK的sharedUserId都設爲一樣,則這些APK之間就可以互相共享數據了。
sharedUserLabel——一個共享的用戶名,它只有在設置了sharedUserId屬性的前提下纔會有意義
versionCode——是給設備程序識別版本(升級)用的必須是一個interger值代表app更新過多少次
versionName——顯示出來的版本名稱
installLocation——安裝參數,installLocation有三個值:internalOnly、auto、preferExternal
選擇preferExternal,系統會優先考慮將APK安裝到SD卡上(當然最終用戶可以選擇爲內部ROM存儲上,如果SD存儲已滿,也會安裝到內部存儲上)
選擇auto,系統將會根據存儲空間自己去適應
選擇internalOnly是指必須安裝到內部才能運行
Androidmanifest.xml的結構——(<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')——用戶是否能選擇自行清除數據,默認爲true,程序管理器包含一個選擇允許用戶清除數據。當爲true時,用戶可自己清理用戶數據,反之亦然
android:allowTaskReparenting('true' or 'false')——是否允許activity更換從屬的任務,比如從短信息任務切換到瀏覽器任務
android:backupAgent——這也是Android2.2中的一個新特性,設置該APP的備份,屬性值應該是一個完整的類名,如com.project.TestCase,此屬性並沒有默認值,並且類名必須得指定(就是個備份工具,將數據備份到雲端的操作)


android:debuggable——這個從字面上就可以看出是什麼作用的,當設置爲true時,表明該APP在手機上可以被調試。默認爲false,在false的情況下調試該APP,就會報以下錯誤:


android:description/android:label——此兩個屬性都是爲許可提供的,均爲字符串資源,當用戶去看許可列表(android:label)或者某個許可的詳細信息(android:description)時,這些字符串資源就可以顯示給用戶。label應當儘量簡短,之需要告知用戶該許可是在保護什麼功能就行。而description可以用於具體描述獲取該許可的程序可以做哪些事情,實際上讓用戶可以知道如果他們同意程序獲取該權限的話,該程序可以做什麼。我們通常用兩句話來描述許可,第一句描述該許可,第二句警告用戶如果批准該權限會可能有什麼不好的事情發生


android:enabled——Android系統是否能夠實例化該應用程序的組件,如果爲true,每個組件的enabled屬性決定那個組件是否可以被 enabled。如果爲false,它覆蓋組件指定的值;所有組件都是disabled。


android:hasCode('true' or 'false')——表示此APP是否包含任何的代碼,默認爲true,若爲false,則系統在運行組件時,不會去嘗試加載任何的APP代碼
一個應用程序自身不會含有任何的代碼,除非內置組件類,比如Activity類,此類使用了AliasActivity類,當然這是個罕見的現象
(在Android2.3可以用標準C來開發應用程序,可在androidManifest.xml中將此屬性設置爲false,因爲這個APP本身已經不含有任何的JAVA代碼了)


android:icon——這個很簡單,就是聲明整個APP的圖標,圖片一般都放在drawable文件夾下


android:name——爲應用程序所實現的Application子類的全名。當應用程序進程開始時,該類在所有應用程序組件之前被實例化。


android:permission——設置許可名,這個屬性若在<application>上定義的話,是一個給應用程序的所有組件設置許可的便捷方式,當然它是被各組件設置的許可名所覆蓋的


android:presistent——該應用程序是否應該在任何時候都保持運行狀態,默認爲false。因爲應用程序通常不應該設置本標識,持續模式僅僅應該設置給某些系統應用程序纔是有意義的。


android:process——應用程序運行的進程名,它的默認值爲<manifest>元素裏設置的包名,當然每個組件都可以通過設置該屬性來覆蓋默認值。如果你想兩個應用程序共用一個進程的話,你可以設置他們的android:process相同,但前提條件是他們共享一個用戶ID及被賦予了相同證書的時候


android:restoreAnyVersion——同樣也是android2.2的一個新特性,用來表明應用是否準備嘗試恢復所有的備份,甚至該備份是比當前設備上更要新的版本,默認是false


android:taskAffinity——擁有相同的affinity的Activity理論上屬於相同的Task,應用程序默認的affinity的名字是<manifest>元素中設定的package名
Androidmanifest.xml的結構——(<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——是否保留狀態不變, 比如切換回home, 再從新打開,activity處於最後的狀態。比如一個瀏覽器擁有很多狀態(當打開了多個TAB的時候),用戶並不希望丟失這些狀態時,此時可將此屬性設置爲true
android:clearTaskOnLaunch——比如 P 是 activity, Q 是被P 觸發的 activity, 然後返回Home, 重新啓動 P,是否顯示 Q
android:configChanges——當配置list發生修改時, 是否調用 onConfigurationChanged() 方法  比如 "locale|navigation|orientation". 這個我用過,主要用來看手機方向改變的. android手機在旋轉後,layout會重新佈局, 如何做到呢?正常情況下. 如果手機旋轉了.當前Activity後殺掉,然後根據方向重新加載這個Activity. 就會從onCreate開始重新加載.如果你設置了 這個選項, 當手機旋轉後,當前Activity之後調用onConfigurationChanged() 方法. 而不跑onCreate方法等.
android:excludeFromRecents——是否可被顯示在最近打開的activity列表裏,默認是false
android:finishOnTaskLaunch——當用戶重新啓動這個任務的時候,是否關閉已打開的activity,默認是false。如果這個屬性和allowTaskReparenting都是true,這個屬性就是王牌。Activity的親和力將被忽略。該Activity已經被摧毀並非re-parented
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鍵,如果按下了返回鍵,則無效
android:multiprocess——是否允許多進程,默認是false
android:noHistory——當用戶從Activity上離開並且它在屏幕上不再可見時,Activity是否從Activity stack中清除並結束。默認是false。Activity不會留下歷史痕跡
android:screenOrientation——activity顯示的模式
默認爲unspecified:由系統自動判斷顯示方向
landscape橫屏模式,寬度比高度大
portrait豎屏模式, 高度比寬度大
user模式,用戶當前首選的方向
behind模式:和該Activity下面的那個Activity的方向一致(在Activity堆棧中的)
sensor模式:有物理的感應器來決定。如果用戶旋轉設備這屏幕會橫豎屏切換
nosensor模式:忽略物理感應器,這樣就不會隨着用戶旋轉設備而更改了
android:stateNotNeeded——activity被銷燬或者成功重啓時是否保存狀態
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:當前窗口的內容將自動移動以便當前焦點從不被鍵盤覆蓋和用戶能總是看到輸入內容的部分
Androidmanifest.xml的結構——(<intent-filter>)
<intent-filter  android:icon="drawable resource"
               android:label="string resource"
               android:priority="integer" >
      <action />
      <category />
      <data />
 
</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是作爲應用程序的入口。有關android:name具體有哪些值,可參照這個網址:http://hi.baidu.com/linghtway/blog/item/83713cc1c2d053170ff477a7.html
category屬性:
category也只有android:name屬性。常見的android:name值爲android.intent.category.LAUNCHER(決定應用程序是否顯示在程序列表裏)
Androidmanifest.xml的結構——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和數據類型(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也必須要指定
mimeType(指定數據類型),若mimeType爲'Image',則會從content Provider的指定地址中獲取image類型的數據。還有'video'啥的,若設置爲video/mp4,則表示在指定地址中獲取mp4格式的video文件
而pathPattern和PathPrefix主要是爲了格式化path所使用的
Androidmanifest.xml的結構——<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])
Androidmanifest.xml的結構——<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負責。
Androidmanifest.xml的結構——<receiver>
receiver的屬性與service一樣
BroadcastReceiver:用於發送廣播,broadcast是在應用程序之間傳輸信息的一種機制,而BroadcastReceiver是對發送出來的 Broadcast進行過濾接受並響應的一類組件
Androidmanifest.xml的結構——<uses-library>
用戶庫,可自定義。所有android的包都可以引用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章