Aby uniknąć rozładowywania baterii, urządzenie z Androidem, które pozostaje nieaktywne, szybko zasypia. Jednak czasami aplikacja musi wybudzić ekran lub procesor i nie wyłączać go, aby wykonać jakąś czynność.
Podejście, które należy zastosować, zależy od potrzeb aplikacji. Aby zminimalizować jej wpływ na zasoby systemowe, stosuj możliwie proste podejście. W poniższych sekcjach opisujemy, jak postępować w przypadku, gdy domyślne zachowanie urządzenia podczas snu jest niezgodne z wymaganiami aplikacji.
Alternatywy dla blokad uśpienia
Zanim dodasz do aplikacji obsługę blokady uśpienia, zastanów się, czy jej przypadki użycia obsługują jedno z tych alternatywnych rozwiązań:
Jeśli Twoja aplikacja długo pobiera treści przez HTTP, rozważ użycie
DownloadManager
.Jeśli Twoja aplikacja synchronizuje dane z serwera zewnętrznego, rozważ utworzenie adaptera synchronizacji.
Jeśli Twoja aplikacja działa w tle, rozważ aktywowanie tych usług w określonych odstępach czasu za pomocą JobScheduler lub Komunikacji w chmurze Firebase.
Jeśli aplikacja towarzysząca ma nadal działać, gdy urządzenie towarzyszące znajduje się w zasięgu, użyj Menedżera urządzeń towarzyszących.
Nie wyłączaj ekranu
Niektóre aplikacje (np. gry lub filmy) muszą pozostawać włączony ekran. Najlepszym sposobem na to jest użycie zdarzenia FLAG_KEEP_SCREEN_ON
w aktywności (i tylko w aktywności, a nie w usłudze czy innym komponencie aplikacji). Na przykład:
Kotlin
class MainActivity : Activity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) } }
Java
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); } }
Zaletą tego podejścia jest to, że w przeciwieństwie do blokad uśpienia (omawianego w artykule Utrzymywanie procesora w trybie włączonym) nie wymaga ono specjalnych uprawnień, a platforma prawidłowo zarządza użytkownikiem podczas przechodzenia między aplikacjami, dzięki czemu aplikacja nie musi martwić się o publikowanie nieużywanych zasobów.
Innym sposobem implementacji jest użycie atrybutu android:keepScreenOn
w pliku XML układu aplikacji:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:keepScreenOn="true"> ... </RelativeLayout>
Użycie właściwości android:keepScreenOn="true"
jest równoważne z użyciem właściwości FLAG_KEEP_SCREEN_ON
.
Użyj metody, która najlepiej pasuje do Twojej aplikacji. Zaletą programowego ustawiania flagi w aktywności jest to, że daje Ci to możliwość późniejszego automatycznego wyczyszczenia flagi i wyłączania ekranu.
Tryb nieaktywny na telewizorze
Na telewizorze należy użyć FLAG_KEEP_SCREEN_ON
, aby uniemożliwić przełączenie urządzenia w Tryb nieaktywny podczas aktywnego odtwarzania filmu. Jeśli aktywność na pierwszym planie nie określa funkcji FLAG_KEEP_SCREEN_ON
, urządzenie automatycznie przejdzie w tryb nieaktywny po określonym czasie.
Nie wyłączaj procesora
Jeśli procesor musi działać, aby wykonać pewne czynności przed uśpieniem urządzenia, możesz skorzystać z funkcji usługi systemowej PowerManager
o nazwie blokady uśpienia. Blokady uśpienia umożliwiają aplikacji kontrolowanie
stanu zasilania urządzenia hosta.
Tworzenie i utrzymywanie blokad uśpienia może mieć ogromny wpływ na żywotność baterii urządzenia hosta. Dlatego blokad uśpienia używaj tylko wtedy, gdy jest to absolutnie konieczne, i trzymaj je jak najkrócej. Na przykład nie powinno się nigdy
koniecznie stosować blokady uśpienia w aktywności. Jeśli chcesz, aby ekran pozostawał włączony w swojej aktywności, użyj FLAG_KEEP_SCREEN_ON
.
Dobrym przykładem zastosowania blokady uśpienia może być usługa w tle, która wymaga stosowania blokady uśpienia, aby procesor mógł działać, gdy ekran jest wyłączony. Należy jednak ograniczyć tę praktykę do minimum ze względu na jej wpływ na żywotność baterii.
Aby korzystać z blokady uśpienia, najpierw do pliku manifestu aplikacji musisz dodać uprawnienie WAKE_LOCK
:
<uses-permission android:name="android.permission.WAKE_LOCK" />
Jeśli aplikacja zawiera odbiornik transmisji, który wykonuje pewne działania za pomocą jakiejś usługi, wykonaj te czynności, aby bezpośrednio ustawić blokadę uśpienia:
Kotlin
val wakeLock: PowerManager.WakeLock = (getSystemService(Context.POWER_SERVICE) as PowerManager).run { newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyApp::MyWakelockTag").apply { acquire() } }
Java
PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE); WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyApp::MyWakelockTag"); wakeLock.acquire();
Aby zwolnić blokadę uśpienia, wywołaj metodę wakelock.release()
.
Roszczenie zostanie wycofane dla CPU. Blokada uśpienia należy włączać zaraz po zakończeniu korzystania z aplikacji, aby uniknąć rozładowywania baterii.