在Froyo(android 2.2,API Level:8)中引入了android:installLocation.經過設置該屬性可使得開發者以及用戶決定程序的安裝位置.html
android:installLocation隸屬於AndroidManifest.XML中的manifest節點.以下所示:android
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="string"
android:sharedUserId="string"
android:sharedUserLabel="string resource"
android:versionCode="integer"
android:versionName="string"
android:installLocation=["auto" | "internalOnly" | "preferExternal"] >
. . .
</manifest>
android:installLocation能夠設置爲"auto"、"internalOnly"、"preferExternal"三個值中的任何一個.
auto:程序可能被安裝在外部存儲介質上(例如:SD Card),可是默認會被安裝到手機內存中.當手機內存爲空時,程序將被安裝到外部存儲介質上.當程序安裝到手機上後,用戶 能夠決定把程序放在外部儲介質仍是內存中.
internalOnly:默認值.當設置爲該值時,程序只能被安裝在內存中,若是內存爲空,則程序將不能成功安裝.
preferExternal:將程序安裝在外部存儲介質上,可是系統不保證程序必定會被安裝到外部存儲介質上.當外部存儲介質不能夠或空時,程序將被安裝到內存中.程序使用了for ward-locking機制時也將被安裝到內存中,由於外部存儲不支持此機制.程序安裝後,用戶能夠自由切換程序應該在外部仍是內部存儲介質上.
注意:當程序使用了Google Play的Copy Protection特性時,只能安裝到內存中.
當程序被安裝到外部存儲介質時,
① .apk文件將被移動到外部存儲介質上,可是程序的數據仍然會在內存中
② 保存.apk文件的容器將會使用一個隨機生成的密鑰進行加密,這樣只有安裝該程序的設置可使用存在外部存儲介質上的數據.
警告:當外部存儲介質被卸載時,安裝在該外部存儲介質上的程序將馬上被終止掉!
向後兼容性:
聲明瞭android:installLocation,但android:minSdkVersion小於8時,咱們使用不低於Froyo的AVD進行編譯,這樣在低於Froyo的系統中android:installLocation將被忽略,而不低於Fro yo的系統中將使用咱們指定的android:installLocation.
當咱們的程序具備以下行爲時咱們不該該將程序安裝到外部存儲介質上
①Service
正在運行的服務將被終止,當外部存儲介質被從新加載時服務不會被重啓.
②Alarm Service
鬧鐘服務將被取消,開發者必須在外部存儲介質從新加載後從新註冊鬧鐘服務.
③Input Method Engines
輸入法將被換成系統輸入法,當外部存儲介質被從新加載後用戶能夠經過系統設置來啓動咱們的輸入法
④Live Wallpapers
咱們的動態壁紙將被替換爲默認的動態壁紙.外部存儲介質重載後,用戶能夠更換回來.
⑤Live Folders
咱們的動態文件夾將被移出.
⑥App Widgets
咱們的小部件將被移出,一般只有系統重啓後咱們的小部件纔可用.
⑦Account Managers
使用AccountManager建立的帳戶將會消失,直至存儲介質被從新加載.
⑧Sync Adapters
只有外部存儲介質被從新加載時,咱們的同步功能纔可用
⑨Device Administrators
咱們的DeviceAdminReceiver將會失效
⑩監聽開機結束事件
系統會在加載外部存儲介質以前發送ACTION_BOOT_COMPLETED廣播.所以安裝在外部存儲介質的程序將不能接受開機廣播.
一般,只要咱們沒有使用上述的特性,咱們就能夠將咱們的程序安裝到外部存儲介質上.例如,大的遊戲程序.當咱們的APK文件有幾M大時咱們應該認真的考慮是否要將程序移動到外部存儲介質上以幫助用戶節省內存.