Począwszy od poziomu interfejsu API 8, możesz zezwolić na instalowanie aplikacji w pamięci zewnętrznej (np. na karcie SD urządzenia). Jest to opcjonalna funkcja, którą możesz zadeklarować
w aplikacji za pomocą atrybutu manifestu android:installLocation. Jeśli nie zadeklarujesz tego atrybutu, aplikacja zostanie zainstalowana tylko w pamięci wewnętrznej i nie będzie można jej przenieść do pamięci zewnętrznej.
Aby zezwolić systemowi na zainstalowanie aplikacji w pamięci zewnętrznej, zmodyfikuj swój
plik manifestu, aby zawierał atrybut android:installLocation w elemencie <manifest>,
z wartością „preferExternal” lub „auto”. Przykład:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:installLocation="preferExternal" ... >
Jeśli zadeklarujesz „preferExternal”, poprosisz o zainstalowanie aplikacji w pamięci zewnętrznej, ale system nie gwarantuje, że aplikacja zostanie zainstalowana w pamięci zewnętrznej. Jeśli pamięć zewnętrzna jest pełna, system zainstaluje aplikację w pamięci wewnętrznej. Użytkownik może też przenieść aplikację między tymi dwiema lokalizacjami.
Jeśli zadeklarujesz „auto”, wskażesz, że aplikacja może zostać zainstalowana w pamięci zewnętrznej, ale nie masz preferencji co do lokalizacji instalacji. System zdecyduje, gdzie zainstalować aplikację, na podstawie kilku czynników. Użytkownik może też przenieść aplikację między tymi dwiema lokalizacjami.
Gdy aplikacja jest zainstalowana w pamięci zewnętrznej:
- Dopóki pamięć zewnętrzna jest zamontowana na urządzeniu, nie ma to wpływu na wydajność aplikacji.
- Plik
.apkjest zapisywany w pamięci zewnętrznej, ale wszystkie prywatne dane użytkownika, bazy danych, zoptymalizowane pliki.dexi wyodrębniony kod natywny są zapisywane w pamięci wewnętrznej urządzenia. - Unikalny kontener, w którym jest przechowywana aplikacja, jest szyfrowany za pomocą losowo wygenerowanego klucza, który może zostać odszyfrowany tylko przez urządzenie, na którym aplikacja została pierwotnie zainstalowana. Dlatego aplikacja zainstalowana na karcie SD działa tylko na jednym urządzeniu.
- Użytkownik może przenieść aplikację do pamięci wewnętrznej za pomocą ustawień systemowych.
Ostrzeżenie: gdy użytkownik włączy pamięć masową USB, aby udostępniać pliki na komputerze, lub odłączy kartę SD za pomocą ustawień systemu, pamięć zewnętrzna zostanie odłączona z urządzenia, a wszystkie aplikacje działające w pamięci zewnętrznej zostaną natychmiast zamknięte.
Zgodność wsteczna
Możliwość zainstalowania aplikacji w pamięci zewnętrznej jest dostępna tylko na urządzeniach z interfejsem API na poziomie 8 (Android 2.2) lub nowszym. Obecne aplikacje, które zostały utworzone przed poziomem interfejsu API 8, zawsze będą instalowane w pamięci wewnętrznej i nie można ich przenieść do pamięci zewnętrznej (nawet na urządzeniach z interfejsem API na poziomie 8). Jeśli jednak aplikacja jest przeznaczona do obsługi interfejsu API na poziomie niższym niż 8, możesz włączyć obsługę tej funkcji na urządzeniach z interfejsem API na poziomie 8 lub nowszym i nadal zachować zgodność z urządzeniami z interfejsem API na poziomie niższym niż 8.
Aby zezwolić na instalację w pamięci zewnętrznej i zachować zgodność z wersjami starszymi niż poziom interfejsu API 8:
- Dodaj atrybut
android:installLocationz wartością "auto" lub "preferExternal" w elemencie<manifest>. - Pozostaw atrybut
android:minSdkVersionbez zmian (wartość mniejsza niż „8”) i upewnij się, że kod aplikacji używa tylko interfejsów API zgodnych z tym poziomem. - Aby skompilować aplikację, zmień docelowy poziom interfejsu API na 8. Jest to konieczne, ponieważ starsze biblioteki Androida nie rozpoznają atrybutu
android:installLocationi nie skompilują aplikacji, jeśli ten atrybut jest obecny.
Gdy aplikacja jest instalowana na urządzeniu z interfejsem API na poziomie niższym niż 8, atrybut android:installLocation jest ignorowany, a aplikacja jest instalowana w pamięci wewnętrznej.
Uwaga: chociaż starsze platformy będą ignorować znaczniki XML, takie jak ten, musisz uważać, aby nie używać interfejsów API wprowadzonych na poziomie interfejsu API 8, gdy minSdkVersion jest mniejszy niż „8”, chyba że wykonasz niezbędne czynności, aby zapewnić zgodność wsteczną w kodzie.
Aplikacje, których nie należy instalować w pamięci zewnętrznej
Gdy użytkownik włączy pamięć masową USB, aby udostępniać pliki na komputerze (lub w inny sposób odmontuje lub usunie pamięć zewnętrzną), każda aplikacja zainstalowana w pamięci zewnętrznej i aktualnie działająca zostanie zamknięta. System przestanie rozpoznawać aplikację, dopóki pamięć masowa nie zostanie wyłączona, a pamięć zewnętrzna nie zostanie ponownie zamontowana na urządzeniu. Oprócz zamknięcia aplikacji i uniemożliwienia użytkownikowi korzystania z niej może to poważnie uszkodzić niektóre typy aplikacji. Aby aplikacja działała zgodnie z oczekiwaniami, nie należy zezwalać na jej instalowanie w pamięci zewnętrznej, jeśli korzysta ona z którejkolwiek z tych funkcji, ze względu na wymienione konsekwencje odmontowania pamięci zewnętrznej:
- Usługi
- Działająca
Servicezostanie zamknięta i nie zostanie ponownie uruchomiona po ponownym zamontowaniu pamięci zewnętrznej. Aplikacje powiązane z tą usługą mogą zarejestrować się w celu odbieraniaACTION_EXTERNAL_APPLICATIONS_AVAILABLEintencji transmisji, która powiadamia wszystkie aplikacje niezainstalowane w pamięci zewnętrznej, gdy aplikacje zainstalowane w pamięci zewnętrznej staną się ponownie dostępne dla systemu. Po otrzymaniu tej transmisji aplikacje mogą próbować powiązać się z Twoją usługą. - Usługi alarmowe
- Alarmy zarejestrowane w
AlarmManagerzostaną anulowane. Po ponownym zamontowaniu pamięci zewnętrznej musisz ręcznie zarejestrować wszystkie alarmy. - Edytory metod wprowadzania
- Twój edytor IME zostanie zastąpiony domyślnym edytorem IME. Po ponownym zamontowaniu pamięci zewnętrznej użytkownik może otworzyć ustawienia systemowe, aby ponownie włączyć Twój edytor IME.
- Animowane tapety
- Działająca animowana tapeta zostanie zastąpiona domyślną animowaną tapetą. Po ponownym zamontowaniu pamięci zewnętrznej użytkownik może ponownie wybrać Twoją animowaną tapetę.
- Widżety
- Twój widżet zostanie usunięty z ekranu głównego. Po ponownym zamontowaniu pamięci zewnętrznej Twój widżet nie będzie dostępny dla użytkownika, dopóki system nie zresetuje aplikacji ekranu głównego (zwykle dopiero po ponownym uruchomieniu systemu).
- Account Managers
- Konta utworzone za pomocą
AccountManagerznikną do czasu ponownego zamontowania pamięci zewnętrznej. - Adaptery synchronizacji
- Twój
AbstractThreadedSyncAdapteri wszystkie jego funkcje synchronizacji nie będą działać do czasu ponownego zamontowania pamięci zewnętrznej. - Administratorzy urządzeń
- Twój
DeviceAdminReceiveri wszystkie jego funkcje administracyjne zostaną wyłączone, co może mieć nieprzewidywalne konsekwencje dla działania urządzenia, które mogą utrzymywać się po ponownym zamontowaniu pamięci zewnętrznej. - Odbiorniki transmisji nasłuchujące „boot completed”
- System dostarcza transmisję
ACTION_BOOT_COMPLETEDprzed zamontowaniem pamięci zewnętrznej na urządzeniu. Jeśli aplikacja jest zainstalowana w pamięci zewnętrznej, nigdy nie będzie mogła odebrać tej transmisji.
Jeśli aplikacja korzysta z którejkolwiek z wymienionych powyżej funkcji, nie należy zezwalać na jej instalowanie w pamięci zewnętrznej. Domyślnie system nie zezwoli na zainstalowanie aplikacji w pamięci zewnętrznej, więc nie musisz się martwić o swoje dotychczasowe aplikacje. Jeśli jednak masz pewność, że aplikacja nigdy nie powinna być instalowana w pamięci zewnętrznej
, wyraźnie to zaznacz, deklarując android:installLocation z wartością „internalOnly”. Nie zmienia to domyślnego zachowania
, ale wyraźnie stwierdza, że aplikacja powinna być instalowana tylko w pamięci wewnętrznej
i przypomina Tobie oraz innym programistom, że taka decyzja została podjęta.
Aplikacje, które należy instalować w pamięci zewnętrznej
Mówiąc prosto, wszystko, co nie korzysta z funkcji wymienionych w poprzedniej sekcji, jest bezpieczne po zainstalowaniu w pamięci zewnętrznej. Duże gry to najczęściej typy aplikacji, które powinny zezwalać na instalację w pamięci zewnętrznej, ponieważ gry zwykle nie zapewniają dodatkowych usług, gdy są nieaktywne. Gdy pamięć zewnętrzna stanie się niedostępna, a proces gry zostanie zamknięty, po ponownym udostępnieniu pamięci i ponownym uruchomieniu gry przez użytkownika nie powinno być widocznych efektów (zakładając, że gra prawidłowo zapisała swój stan podczas normalnego cyklu życia aktywności).
Jeśli plik APK aplikacji zajmuje kilka megabajtów, zastanów się, czy zezwolić na instalowanie aplikacji w pamięci zewnętrznej, aby użytkownicy mogli zaoszczędzić miejsce w pamięci wewnętrznej.
Dodatkowe informacje na ten temat znajdziesz w artykule: <manifest>.