編輯:Android開發實例
前言
本章內容為開發者指南(Dev Guide)/Developing/Appendix/App Install Location,版本為Android3.0 r1,翻譯來自"madgoat。
原文
http://developer.android.com/guide/appendix/install-location.html
正文
自API Level 8開始,你可以允許你的應用安裝至擴展存儲(例如,SD卡)。這是一個可選功能,你可以在你應用的manifest屬性android:installLocation
裡設定。如果你沒設定這個屬性,那麼你的應用將被安裝到內置存儲,而且將不允許移動到擴展存儲上。
為了允許系統可以在擴展存儲上安裝你的應用,修改你的manifest文件,在 <manifest> 元素中包含android:installLocation 屬性,設置其值為"preferExternal"或"auto"。例如:
<manifest xmlns:android=http://schemas.android.com/apk/res/android
android:installLocation="preferExternal"
... >
如果你定義了 "preferExternal",意味著你要求你的應用安裝至擴展存儲,但是系統不能保證應用肯定會安裝至擴展存儲。如果擴展存儲沒有空間了,系統將把應用安裝到內置存儲。用戶可以在兩個位置之間移動你的應用。
如果你定義了 "auto",表示你的應用可能會安裝在擴展存儲,但是對安裝位置沒有特別的偏好。系統將基於很多因素決定你的應用安裝到哪裡。用戶同樣可以將應用在兩個位置之間移動。
當你的應用安裝在擴展存儲上:
* 只要擴展存儲已經掛載在設備上,對應用的性能都沒有影響。
* .
apk 文件保存在擴展存儲上,但是所有的用戶私有數據,數據庫,優化過的 .dex 文件和釋放的原生代碼都保存在內置存儲空間上。
* 存儲你應用的唯一容器是被一個隨機生成的KEY加密存放的,僅僅能被最初安裝的設備進行解密操作。因此,安裝在SD卡上的應用僅僅針對一個設備可以工作。
* 用戶可以通過系統設置移動你的應用到內置存儲。
警告:當用戶啟用USB大容量存儲以共享文件給計算機或者通過系統設置卸載SD卡,外置存儲從設備卸載並且所有運行在外置存儲的應用立刻都被結束。
向後兼容Backward Compatibility
將你的應用安裝至擴展存儲的功能是運行API Level 8(Android 2.2)及以上版本的設備才有效的。使用API Level 8 之前的版本編譯的已存在的應用,將一直安裝在內置存儲,並且無法移動至擴展存儲(即使設備上運行的是API Level 8版本的系統)。然而,如果你的應用計劃支持低於8的API Level,你可以選擇針對API Level 8及更高版本支持此特性,並且繼續保持與低於API level 8的設備兼容。
為了允許安裝在擴展存儲並且保持與API Level 8或更低版本兼容:
* 在 <manifest>
元素中,包含值為"auto"或 "preferExternal" 的 android:installLocation 屬性。
* 繼續保持你的 android:minSdkVersion 屬性不變(小於8的值)並且確定你的應用代碼只使用與此level保持兼容的API。
* 為了編譯你的應用,更改你的build target為API Level 8。這步操作是必須的,因為舊的Android庫無法理解 android:installLocation 屬性,並且當該屬性存在時,也不會編譯你的應用。
當你的應用安裝到API Level 低於8的設備上時, android:installLocation 屬性被忽略,並且應用會被安裝至內置存儲上。
注意:盡管XML標記,例如這個將被之前的平台忽略,但你還是要小心不要使用API Level 8中的編程API,除非你在你的代碼中提供向後兼容。關於在應用代碼中創建向後兼容的信息,請參考 Backward Compatibility 這篇文章。
不應當安裝在擴展存儲的應用
Applications That Should NOT Install on External Storage
當用戶啟用USB大容量存儲來給他們的計算機共享文件時(卸載或移除擴展存儲),任何安裝在擴展存儲上並正在運行的應用都會被結束。實際上此時系統並不知道應用程序的存在,直到大容量存儲關閉,或者擴展存儲重新掛載到設備上。除了殺死該應用程序使它對用戶不可用,它還會使用更嚴重地方式中斷某些類型的應用程序。為了使你的應用始終如你所期望的那樣運行,當你使用了下面任何一種特性,那你就不應當允許你的應用安裝到擴展存儲上去,以避免產生當擴展存儲被卸載時所導致的後果:
服務Services
當擴展存儲被卸載時,你正在運行的Service
將被結束並且不會再重新啟動。你可以注冊 ACTION_EXTERNAL_APPLICATIONS_AVAILABLE
廣播(broadcast) Intent,當安裝在擴展存儲上的應用對系統重新有效時,會通知你的應用。在那個時候,你可以重新啟動你的Service。
定時服務Alarm Services
你注冊到 AlarmManager
的鬧鐘會被取消。當擴展存儲重新掛載時,你必須手工重新注冊。
輸入法引擎Input Method Engines
你的輸入法(IME)將被替換為默認輸入法。當擴展存儲重新掛載,用戶可以打開系統設置以重新啟用你的輸入法。
壁紙Live Wallpapers
你正在運行的 Live Wallpaper 會被替換為默認的。當擴展存儲被掛載時,用戶可以重新選擇Live Wallpaper。
Live Folders
你的 Live Folder 將被從home屏幕被移除。當擴展存儲被掛載上時,用戶可以重新添加Live Folder到Home界面。
應用程序部件App Widgets
你的App Widget將被從Home界面移除,當擴展存儲被掛載時,在系統重置Home應用之前,用戶將無法使用你的App Widget(通常直到系統重啟)。
Account Managers
在擴展存儲被掛載之前,你使用 AccountManager
創建的賬戶都是不可見的。
Sync Adapters
在擴展存儲被掛載之前,你的 AbstractThreadedSyncAdapter
和所有相關的同步功能將無法工作。
Device Administrators
你的 DeviceAdminReceiver
和它的管理能力會被禁止,這會導致設備功能產生無法預料的結果,這種現象會持續到擴展存儲重新掛載為止。
Broadcast Receivers listening for "boot completed"
T系統在擴展存儲掛載到設備前發送廣播 ACTION_BOOT_COMPLETED
。所以如果你的應用安裝到擴展存儲上,它擁有也接收不到這個廣播。
如果你的應用使用的上面列表中的任何一種特性,那你就不應該允許你的應用安裝到擴展存儲上去。默認情況下,系統將不允許你的應用安裝至擴展存儲,所以你不需要擔心你已存在的應用。然而,如果你不確定你的應用是否永遠不會安裝到擴展存儲上去,那麼你可以通過定義 android:installLocation
值為 "internalOnly"來確保其安裝至內置存儲。盡管這不會改變默認的行為,但它明確的指出,你的應用只會被安裝在內置存儲上並且作為提醒你和其他開發人員已經做出決定。
應當安裝在擴展存儲的應用
Applications That Should Install on External Storage
簡單來說,任何沒有使用上一章節功能列表中的應用安裝在擴展存儲上都是安全的。大型的游戲更是常見的應該允許安裝至擴展存儲的應用類型,因為游戲當處於非激活狀態時,通常不需要提供額外的服務。當擴展存儲無效後,游戲進程被結束,這並不會帶來明顯的影響,當存儲重新有效後,用戶可以重新啟動游戲 (假設游戲在正常的 Activity lifecycle中保存了狀態)。
如果你的應用的APK文件大小為幾兆(M),那你就需要認真考慮是否啟用應用安裝至擴展存儲了,這樣的話用戶可以保留他們的內置存儲空間。
本文實例講述了Android實現ListView異步加載圖片的方法。分享給大家供大家參考。具體如下: ListView異步加載圖片是非常實用的方法,凡是是要通過網
第一步:代碼混淆(注意引入的第三方jar) 在新版本的ADT創建項目時,混碼的文件不再是proguard.cfg,而是project.properties和pro
JSON代表JavaScript對象符號。它是一個獨立的數據交換格式,是XML的最佳替代品。本章介紹了如何解析JSON文件,並從中提取所需的信息。Android提供了四個
可以顯示在的Android任務,通過加載進度條的進展。進度條有兩種形狀。加載欄和加載微調(spinner)。在本章中,我們將討論微調(spinner)。Spinner 用