Android 基础 一 AndroidManifest.xml
一、概述
AndroidManifest.xml是Android應用的入口文件,它描述了package中暴露的組件(activities, services, 等等),他們各自的實現類,各種能被處理的數據和啟動位置。 除了能聲明程序中的Activities, ContentProviders, Services, 和Intent Receivers,還能指定permissions和instrumentation(安全控制和測試)。
二、結構
<?xmlversion="1.0"encoding="utf-8"?> <manifest> <uses-sdk/> <uses-configuration/> <uses-feature/> <uses-permission/><permission/><permission-tree/><permission-group/><instrumentation/> <supports-screens/><application> <activity> <intent-filter><action/>
<data />
<type/>
<schema/>
<authority/>
<path/>
<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> </manifest>
清單由一個根manifest標簽構成,該標簽帶有一個設置項目包的package屬性。它通常包含一個xmlns:android屬性來提供文件內使用的某些系統屬性。下面的XML代碼段展示了一個典型的聲明節點:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.mypackage"android:sharedUserId="string" <!-- android.uid.system -->android:sharedUserLabel="string resource"android:versionCode="integer"android:versionName="string"android:installLocation=["auto" | "internalOnly" | "preferExternal"] >
<!-- preferExternal 優先考慮將apk安裝到SD卡,選擇auto會根據存儲空間自己去適應,選擇internalOnly是指必須安裝到內部才能運行。--> </manifest>
?
<manifest>中包含了包名如 package="cn.androidlover.demo" 、軟件的版本號 android:versionCode="1" 以及 android:versionName="1.0"的屬性,manifest標簽還包含了一些節點(node),它們定義了應用程序組件、安全設置和組成應用程序的測試類。下面列出了一些常用的manifest節點標簽,并用一些XML代碼段說明了它們是如何使用的。
2.1 application
一個清單只能包含一個application節點。它使用各種屬性來指定應用程序的各種元數據(包括標題、圖標和主題)。它還可以作為一個包含了活動、服務、內容提供器和廣播接收器標簽的容器,用來指定應用程序組件。
<application android:allowClearUserData=["true" | "false"] 是否自行清除數據,默認為trueandroid:allowTaskReparenting=["true" | "false"] 是否允許Activity更換從屬的任務android:debuggable=["true" | "false"] 設備是否可被調試android:description="string resource" android:enabled=["true" | "false"] android:hasCode=["true" | "false"] android:icon="drawable resource" android:label="string resource" android:manageSpaceActivity="string" android:name="string" android:permission="string" android:persistent=["true" | "false"] android:process="string" android:taskAffinity="string" 擁有相同的affinity的Activity理論上屬于相同的Taskandroid:theme="resource or theme" > . . . </application>
?
2.2 activity
應用程序顯示的每一個Activity都要求有一個activity標簽,并使用android:name屬性來指定類的名稱。這必須包含核心的啟動Activity和
其他所有可以顯示的屏幕或者對話框。啟動任何一個沒有在清單中定義的Activity時都會拋出一個運行時異常。每一個Activity節點都允許使
用intent-filter子標簽來指定哪個Intent啟動該活動。
<activity
android:name=".MyActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:allowTaskReparenting=["true" | "false"] 是否保留最后的狀態不變android:alwaysRetainTaskState=["true" | "false"]android:clearTaskOnLaunch=["true" | "false"] ActivityB被ActivityA觸發,返回后重新啟動ActivityA是否顯示ActivityBandroid: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>
?
2.3 provider
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" > </provider>
?
2.4 receiver
通過添加receiver標簽,可以注冊一個廣播接收器(Broadcast Receiver),而不用事先啟動應用程序。廣播接收器就像全局事件監聽器一樣,一旦注冊了之后,無論何時,只要與它相匹配的intent被應用程序廣播出來,它就會立即執行。通過在聲明中注冊一個廣播接收器,可以使這個進程實現完全自動化。如果一個匹配的Intent被廣播了,則應用程序就會自動啟動,并且你注冊的廣播接收器也會開始運行。
<receiver 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" > </receiver>
?
2.5 service
Service作為Android四大組件之一,在每一個應用程序中都扮演著非常重要的角色。它主要用于在后臺處理一些耗時的邏輯,或者去執行某些需要長期運行的任務。
<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>
?
2.6 uses-permission
作為安全模型的一部分,uses-permission標簽聲明了那些由你定義的權限,而這些權限是應用程序正常執行所必需的。在安裝程序的時候,你設定的所有權限將會告訴給用戶,由他們來決定同意與否。對很多本地Android服務來說,權限都是必需的,特別是那些需要付費或者有安全問題的服務(例如,撥號、接收SMS或者使用基于位置的服務)。如下所示,第三方應用程序,包括你自己的應用程序,也可以在提供對共享的程序組件進行訪問之前指定權限。
<uses-permission android:name="android.permission.ACCESS_LOCATION"> </uses-permission>
2.7 permission
在可以限制訪問某個應用程序組件之前,需要在清單中定義一個permission。可以使用permission標簽來創建這些權限定義。然后,應用程序組件就可以通過添加android:permission屬性來要求這些權限。再后,其他的應用程序就需要在它們的清單中包含uses-permission標簽(并且通過授權),之后才能使用這些受保護的組件。
在uses-permission標簽內,可以詳細指定允許的訪問權限的級別(normal、dangerous、signature、signatureOrSystem)、一個 label屬性和一個外部資源,這個外部資源應該包含了對授予這種權限的風險的描述。
<permission
android:name="com.liujc.DETONATE_DEVICE" android:protectionLevel="dangerous" android:label="Self Destruct" android:description="@string/detonate_description"> </permission>
2.8? instrumentation
instrumentation類提供一個框架,用來在應用程序運行時在活動或者服務上運行測試。它們提供了一些方法來監控應用程序及其與系統資源的交互。對于為自己的應用程序所創建的每一個測試類,都需要創建一個新的節點。
<instrumentation
android:label="My Test"
android:name=".MyTestClass"
android:targetPackage="com.liujc.test">
</instrumentation>
?2.9 uses-feature
Android Market會根據uses-feature過濾所有你設備不支持的應用。通過使用<uses-feature>元素,一個應用可以指定它所支持的硬件型號,舉個例子,有些設備不支持多點觸控或者OpenGL ES 2.0,那么過濾器就會過濾需要這些硬件支持(多點觸控或者OpenGL ES 2.0)的應用,用戶就不會在android market上看到這些應用。
<uses-feature
android:name="string"
android:required=["true" | "false"]
android:glEsVersion="integer" />
name屬性指定了應用的特征,required屬性告訴過濾器我們是否在任何情況下必須要需要這個設備的支持,或者僅僅只是“nice to have”。最后一個屬性是可選擇的,只是用在需要指定一個OpenGL ES版本的時候。
接下來的幾個硬件特征對于游戲開發是非常有用的。
android.hardware.touchscreen.multitouch:它要求設備有一個多點觸控的屏幕以支持基本的多點觸控交互,就如收縮(放大)圖像比例。這些類型的屏幕跟蹤多個手指的能力都有所不同,所以你必須確保這個屏幕的性能是能夠支持的游戲進行。
android.hardware.touchscreen.multitouch.distinct: 這是一個多點觸控的兄弟屬性,它要求提設備供完整的多點觸控功能。我們將會在接下來的章節片段中看到多點觸控。現在只要記住在當你的游戲需要一個支持多點觸控的屏幕的時候,我們可以使用 <uses-feature>元素來剔除所有不支持多點觸控的設備,就像下面這樣:
<uses-feature
android:name="android.hardware.touchscreen.multitouch"
android:required="true"/>
如果你的游戲需要更強大的圖形處理能力,我們可以指定OpenGL ES 2.0,然后我們的游戲只會被支持OpenGL ES 2.0的設備所看見。注意,這里一般不使用OPenGL ES 2.0, 我們只是過濾那些不能提供足夠圖形處理能力的設備。下面顯示了我們怎么去實現它。
<uses-feature android:glEsVersion="0x00020000" required="true"/>
?2.10 intent-filter?
<intent-filter android:icon="drawable resource"android:label="string resource"android:priority="integer" ><action /><category /><data /></intent-filter>
參考文章:https://blog.csdn.net/u012486840/article/details/52468931
轉載于:https://www.cnblogs.com/qiangge-python/p/9762777.html
總結
以上是生活随笔為你收集整理的Android 基础 一 AndroidManifest.xml的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 洱海对面是苍山吗
- 下一篇: 求一个qq情侣网名在线制作