Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> App Install Location

App Install Location

編輯:關於Android編程

從API level 8開始,用戶可以將應用程序安裝到外部存儲設備中(如SD卡)。該屬性可以通過android:installLocation屬性在manifest中聲明。如果不聲明該屬性,應用程序將只會安裝在內存中,而且不能移動到外部存儲設備。
要將應用程序安裝到外部存儲設備中,只需修改manifest文件,在manifest元素中添加android:installLocation屬性,屬性值為preferExternal或auto。例如:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      android:installLocation="preferExternal"
      ... >


如果該屬性值設為"preferExternal",表明用戶要求應用程序安裝在外部存儲設備中,但是系統並不保證應用程序真的安裝在外部存儲設備中。如果外部存儲設備的空間已滿,系統仍然會將應用程序安裝在內存中。用戶也可以在兩個位置之間移動應用程序。
如果該屬性值設為"auto",表明應用程序可能安裝在外部存儲設備中,但是用戶本身對安裝位置沒有特殊要求。系統會根據多種因素決定將應用程序安裝在哪裡。用戶也可以在兩個位置之間移動應用程序。
當應用程序安裝在外部存儲設備中時:
只要外部存儲設備裝載在設備上,應用程序的性能就不會受到影響。
.apk文件是保存在外部存儲設備中的,但是所有的私有用戶數據、數據庫、優化的.dex文件和提取的本地代碼都是保存在設備的內存中的。
保存應用程序的唯一容器經過一個隨機產生的密鑰進行加密。該密鑰只能由最初安裝該程序的設備解密。因此,安裝在SD卡上的應用程序只能在某一個固定的設備上運行。
用戶可以通過系統設置將應用程序移動到內存上。
注意: 當用戶使用USB大容量存儲器與計算機共享文件時,或通過系統設置卸載SD卡時,外部存儲設備將從本設備卸載,並且所有在該外部存儲設備中運行的應用程序將立刻被關閉。
向後兼容
應用程序能夠安裝在外部存儲設備中是API level 8 (android 2.2) 以上的設備的特點。在此之前的應用程序只能安裝在內存中,且不能移動到外部存儲設備中(即使設備是API level 8的)。然而,如果應用程序設計的時候就支持低於API level 8的設備的,那麼用戶可以選擇在API level 8及以上的設備上是否需要支持這一特性,並且在使用API level 8 以下的設備的時候仍然兼容。
要在外部存儲設備中安裝程序,並且與低於API level 8 的版本兼容,需要做到以下幾點:
1. 在manifest元素中添加android:installLocation屬性,設屬性值為"auto"或"preferExternal"。
2. 保持android:minSdkVersion屬性不變(低於8的某個值),確保應用程序的代碼能夠兼容該等級。
3. 為了能夠編譯程序,將生成目標設為API level 8。 這一步必不可少,因為舊的android庫不識別android:installLocation屬性,當該屬性存在時,應用程序將無法編譯通過。
當應用程序安裝在低於API level 8 的設備中時,android:installLocation屬性將被忽略,應用程序將安裝在內存中。
注意: 盡管在老的平台上,類似這種的XML標記會被忽略, 但是在android:minSdkVersion低於8時,編程時也一定要注意避免使用API level 8 推薦的寫法,除非在代碼中已經提供了向後兼容。更多關於應用程序代碼中的向後兼容的信息,請參考Backward Compatibility條目。
不應裝在外部存儲設備的程序
當用戶使用USB大容量存儲器與計算機共享文件時(或相反地,卸載或移除外部存儲設備時),任何安裝在外部存儲設備中、正在運行的應用程序將會被關閉。直到大容量存儲設備不可用、隨機又重新加載到設備中時,系統才會無法識別應用程序。除了關閉應用程序使其不可用之外,有些情況下會嚴重損壞某種類型的應用程序。鑒於以上後果,如果應用程序有以下特點,為了讓應用程序持續照常運行,用戶應該允許應用程序安裝在外部存儲設備上。
服務
當外部存儲設備重新加載時,原本運行的服務將被關閉,且不能重啟。然而,用戶可以注冊ACTION_EXTERNAL_APPLICATIONS_AVAILABLE廣播,該廣播會通知安裝在外部存儲設備上的應用程序系統再次可用了。那時,用戶就可以重啟服務了。
警告服務
使用AlarmManager注冊的所有警告將會取消。當外部存儲設備重新加載時,用戶必須重新手動注冊。
輸入法
用戶的輸入法將會由默認的代替。當外部存儲設備重新加載時,用戶可以通過系統設置重新啟用自己的輸入法。
動態壁紙
運行中的動態壁紙將會被默認的動態壁紙代替。當外部存儲設備重新加載時,用戶可以重新選擇動態壁紙。
活動文件夾
活動文件夾將會從主頁面移除。當外部存儲設備重新加載時,用戶可以重新添加活動文件夾到主頁面。
窗口小部件
用戶的應用程序窗口小部件將會從主頁面移除。當外部存儲設備重新加載時,窗口小部件不可用,除非用戶重置了主頁面應用程序(通常是系統重啟)。
帳號管理
由AccountManager創建的帳戶將會消失,直到外部存儲設備重新加載為止。
同步適配器
AbstractThreadedSyncAdapter及其所有的同步功能將失效,直到外部存儲設備重新加載為止。
設備管理器
DeviceAdminReceiver及其管理功能將會失效,這將會給設備功能帶來無法預料的後果,這個後果將一直持續到外部存儲設備重新加載為止。
監聽“啟動完成”的廣播接收器
在外部存儲設備加載到設備之前,系統負責ACTION_BOOT_COMPLETED廣播。如果應用程序安裝在外部存儲設備中,將無法接收到這個廣播。
復制保護
如果使用了android電子市場的復制保護,應用程序將無法安裝在SD卡上。然而,如果使用了android電子市場的應用程序許可證,應用程序將可以安裝在內存或外部存儲設備上,包括SD卡。
如果應用程序包含以上特點,那麼用戶不應該將應用程序安裝在外部存儲設備中。 默認情況下,系統不允許將應用程序安裝到外部存儲設備中,所以用戶不用擔心已經存在的應用程序。 然而,如果用戶非常肯定應用程序永遠都不會安裝在外部存儲設備中,那麼用戶可以顯示地聲明android:installLocation屬性,並將屬性值設為"internalOnly". 盡管這樣不會改變系統的默認屬性,但是這樣非常明確地聲明了應用程序只能安裝在內存中,給了用戶和其他開發者一個明確的提示。
應該裝在外部存儲設備的程序 www.2cto.com
簡單地說,任何沒有使用上述特點的應用程序,安裝在外部存儲設備時都是安全的。大型游戲通常就是應該裝在外部存儲設備的程序類型,因為游戲不使用時通常不需要提供額外的服務。當外部存儲設備不可用時,游戲進程結束,當存儲設備再次可用時,不應該有明顯的影響,用戶重啟游戲即可(假設游戲在正常的活動周期內恰當地存儲了游戲狀態)。
如果apk文件需要好幾兆空間,用戶就需要考慮是否將應用程序安裝在外部存儲設備上,為內存保留更多的空間。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved