Nie usypiaj urządzenia

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ń:

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.