從API8開始,你可以將你的應用安裝在外部儲存。這是一個可選的特徵,你可以在你的應用的manifest中聲明:android:installLocation屬性。如果你不聲明這個屬性,你的應用程式將會被安裝在內部儲存,並且不能被移到外置儲存。
當你聲明了preferExternal,你要求你的應用程式安裝在外置儲存,但是系統不確定你的程式一定安裝在外置儲存。若外置儲存已經滿了,將會儲存在內建儲存。使用者也可以在兩個儲存之間移動你的應用程式。若你聲明了auto,你表明你的應用程式可以安裝在外置儲存,但是你沒有一個安裝位置的偏好。系統會根據一些因素來決定你的應用程式安裝在哪。使用者也可以在兩個儲存之間移動你的程式。
當你的應用被安裝在外置儲存:
1.當你的外置儲存掛載在你的裝置上時,對你的應用操作沒有影響。
2..apk檔案會儲存在外置儲存,但是所有私人的使用者資料,資料庫,最佳化的.dex檔案,和提取的本地的代碼都會儲存在內建儲存。
3.你的應用被安裝的容器使用一個隨機產生的key加密,而且只能被安裝了這個應用的這個裝置解密,這樣保證一個sdcard上只有一款相同的應用。
4.使用者可以通過系統設定將你的應用移到內建儲存。
注意:當使用者使用usb儲存和電腦共用檔案或通過系統設定卸載SD Card,在外置儲存中啟動並執行應用會立即被殺死。
向前相容
在API8之前安裝的應用會被安裝在內建儲存,並且不會被移動到外置儲存。
但是你的應用可以通過設定來支援低於API8:、
1.在中設定android:instaillLocation為auto或perferExternal.
2.不用修改minSDKVersion,並且保證你的應用代碼是相容的
3.為了編譯你的應用程式,將你的build target改為API8,因為低的android庫不認識instaillLocation屬性,而且不會編譯你的應用程式。
那些不用安裝在外置儲存的應用
使用者使用usb儲存和電腦共用檔案或通過系統設定卸載SD Card,在外置儲存中啟動並執行應用會立即被殺死。
為了使你的應用能按預期的執行,如果你使用了一下的特徵你不能將你的應用安裝在外置儲存。
1.服務:你啟動並執行服務將會被殺死,而且當外置儲存被掛載時也不會重啟。但是你可以註冊一個 ACTION_EXTERNAL_APPLICATIONS_AVAILABLE的廣播intent,這樣當你外置應用變得可用的時候會被提醒。
2.警示器服務:你用AlarmManager註冊的服務將被取消,你必須在外置儲存被重新掛載的時候重新註冊。
3.輸入方法引擎:你的IME將會被預設IME取代。
4.動態壁紙:你運行著的壁紙將會被預設的動態壁紙取代。
5.App widget:你的Appwidget會被從案頭移除。
6.賬戶管理:使用AccountManager建立的賬戶會消失。
7.同步Adapter:你的AbstractThreadedSyncAdapter 以及它的一切同步方法將不會工作。
8.boot completed這個廣播的接受者:系統會在外置儲存器被掛載之間發出ACTION_BOOT_COMPLETED 的廣播,你安裝在外置儲存的應用不會受到這個廣播。
那些需要安裝在外置儲存的應用
出去以上列表的,其他的應用都可以安裝在外置儲存,大遊戲通常安裝在外置儲存中,因為遊戲在它不活躍的時候不需要提供額外的服務,當外置儲存不可用,遊戲將會被殺掉,當外置儲存變得可用而且使用者重啟遊戲,不應該有可見的影響(假設遊戲在它正常的Activity生命週期適當的儲存了狀態)
當你的應用需要MB的apk檔案時,你應該仔細考慮時候應該將應用安裝在外置儲存,來使使用者儲存內建儲存空間。