Nie usypiaj urządzenia

Urządzenie z Androidem, które jest bezczynne, szybko się wyczerpuje, aby uniknąć wyczerpania baterii spać. Jednak czasami zdarza się, że aplikacja musi wybudzić ekran. lub procesora i nie usypiać, aby wykonać jakieś zadanie.

Wybór metody zależy od potrzeb aplikacji. Zgodnie z ogólną zasadą jest zalecenie, aby zastosować najprostszą metodę aplikacji, aby zminimalizować jej wpływ na zasoby systemowe. W poniższych sekcjach opisać, jak postępować w przypadkach, w których domyślny sposób usypiania urządzenia jest niezgodne z wymaganiami Twojej aplikacji.

Alternatywy dla blokad uśpienia

Zanim dodasz do swojej aplikacji obsługę blokady uśpienia, zastanów się, czy nie są dostępne w przypadku jednego z tych rozwiązań alternatywnych:

Nie wyłączaj ekranu

Niektóre aplikacje, na przykład gry lub filmy, muszą mieć włączony ekran. aby to zrobić, użyj FLAG_KEEP_SCREEN_ON w Twojej aktywności (i tylko w trakcie jej aktywności, nigdy w usłudze czy innej 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 (omówione w sekcji Ustawianie CPU On), nie wymaga specjalnych uprawnień, a platforma poprawnie zarządza użytkownikiem przenoszonym między aplikacjami, a aplikacja nie potrzebuje i martwić się zwalnianiem nieużywanych zasobów.

Innym sposobem implementacji tego rozwiązania jest plik XML układu aplikacji – za pomocą metody atrybut android:keepScreenOn:

<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 android:keepScreenOn="true" jest równoważne z używaniem FLAG_KEEP_SCREEN_ON Możesz zastosować metodę, która najbardziej odpowiada Twojej aplikacji. Zaletą konfiguracji oznacza to, że możesz automatycznie programowo usuwając flagę później i umożliwiając odwrócenie ekranu. wyłączone.

Tryb nieaktywny na telewizorze

W telewizji FLAG_KEEP_SCREEN_ON powinien być używany, by urządzenie nie przechodziło Tryb nieaktywny podczas odtwarzania filmu. Gdy zasada FLAG_KEEP_SCREEN_ON jest nieskonfigurowana na podstawie aktywności na pierwszym planie, urządzenie automatycznie włączy Tryb nieaktywny po okresie braku aktywności.

Nie wyłączaj procesora

Jeśli procesor musi pozostawać uruchomiony w celu wykonania pewnych działań przed urządzenie przejdzie w tryb uśpienia, możesz użyć funkcja usługi systemowej PowerManager blokad uśpienia. Blokady uśpienia pozwalają aplikacji kontrolować stan zasilania na urządzeniu hostującym.

Tworzenie i przytrzymywanie blokad uśpienia może mieć ogromny wpływ na system żywotności baterii. Z tego powodu blokad uśpienia należy używać tylko wtedy, gdy jest to konieczne. i przytrzymaj je jak najkrócej. Na przykład: używać blokady uśpienia w trakcie aktywności. Jak opisano powyżej, jeśli chcesz zachować atrybut włącz ekran w swojej aktywności, użyj FLAG_KEEP_SCREEN_ON

Jednym z prawidłowych przypadków użycia blokady uśpienia może być usługa w tle, która musi ustawić blokadę uśpienia, aby procesor mógł działać, gdy ekran jest włączony wyłączone. Trzeba jednak ograniczyć tę praktykę, ponieważ ma ona wpływ żywotności baterii.

Aby używać blokady uśpienia, najpierw dodaj WAKE_LOCK: plik manifestu aplikacji:

<uses-permission android:name="android.permission.WAKE_LOCK" />

Jeśli Twoja aplikacja ma odbiornik, który używa usługi do wykonywania zadań, Oto jak ustawić blokadę uśpienia bezpośrednio:

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 usunąć blokadę uśpienia, zadzwoń pod numer wakelock.release() Spowoduje to zwolnienie Twojego prawa do procesora. Ważne jest, by wyłączyć blokadę uśpienia, zaraz po zakończeniu korzystania z aplikacji przez aplikację, aby uniknąć rozładowywania baterii.