Jak zapobiec programowemu zasypianiu urządzenia z systemem Android?

155

Jak zapobiec programowemu zasypianiu urządzenia z systemem Android?

James
źródło

Odpowiedzi:

133

Jedną z opcji jest użycie blokady wybudzania . Przykład z dokumentów:

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "My Tag");
wl.acquire();

// screen and CPU will stay awake during this section

wl.release();

Na tej stronie znajduje się również tabela opisująca różne rodzaje wakelocków.

Należy pamiętać, że podczas korzystania z blokady wybudzania należy zachować ostrożność. Upewnij się, że zawsze release()blokujesz, gdy skończysz z tym (lub nie na pierwszym planie). W przeciwnym razie Twoja aplikacja może potencjalnie spowodować poważne wyczerpanie baterii i zużycie procesora.

Dokumentacja zawiera również przydatną stronę, która opisuje różne podejścia do utrzymywania urządzenia w stanie czuwania i kiedy możesz go użyć. Jeśli „zapobieganie uśpieniu urządzenia” odnosi się tylko do ekranu (bez utrzymywania aktywnego procesora), wówczas blokada wybudzania jest prawdopodobnie większa niż potrzeba.

Musisz również upewnić się, że masz uprawnienie WAKE_LOCK ustawione w swoim manifeście, aby użyć tej metody.

eldarerathis
źródło
21
Nie powinieneś już tego używać, ponieważ ta metoda jest teraz przestarzała. Spójrz na jedną z pozostałych odpowiedzi.
DuKes0mE
4
Nadal istnieje kilka powodów, dla których warto korzystać z wakelocków, na przykład jeśli urządzenie jest przeznaczone do określonej aplikacji i musi działać nawet po zminimalizowaniu.
Muz
2
PowerManager.PARTIAL_WAKE_LOCK nie jest przestarzały i myślę, że jest to najbardziej wydajna metoda. Pozwala użytkownikowi na naciśnięcie przycisku zasilania, ale procesor będzie nadal włączony, dopóki użytkownik nie wywoła release ();
Mansour Fahad
Oficjalna dokumentacja mówi: „Jeśli chcesz, aby procesor działał, aby zakończyć pracę, zanim urządzenie przejdzie w stan uśpienia, możesz użyć funkcji usługi systemu PowerManager zwanej blokadą budzenia”.
Joaquin Iurchuk,
To świetny sposób, ale jest przestarzały. sprawdź tę odpowiedź: stackoverflow.com/a/22447615/5327912
Parth Anjaria
240

Jeśli chcesz tylko zapobiec trybowi uśpienia na określonym View, po prostu wywołaj setKeepScreenOn(true)to Viewlub ustaw keepScreenOnwłaściwość na true. Zapobiegnie to wygaszaniu ekranu, gdy Viewjest na ekranie. Nie jest do tego wymagane specjalne pozwolenie.

Witek
źródło
18
Nie zmusi to również telefonu do czuwania poza okresem życia aplikacji. Możesz napotkać ten problem z WakeLock.
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
2
Tak, w większości przypadków jest to lepsze podejście.
Edward Falk,
8
To powinna być wybrana odpowiedź. Prosty, czysty i zgodny z zamierzeniami Androida. Dziękuję Ci.
Lior Iluz
2
„Korzystanie z android: keepScreenOn =„ true ”jest równoznaczne z użyciem FLAG_KEEP_SCREEN_ON. Możesz zastosować dowolną metodę, która jest najlepsza dla Twojej aplikacji. Zaletą ustawiania flagi programowo w Twojej aktywności jest to, że daje możliwość programowego wyczyszczenia flagi później i w ten sposób umożliwiając wyłączenie ekranu ”- developer.android.com/training/scheduling/wakelock.html
Antonino
Zwróć uwagę, że setKeepScreenOn(true)zadziała tylko wtedy, gdy Viewjest widoczny.
Jeff T.
121

Znalazłem inne działające rozwiązanie: dodaj następujący wiersz do swojej aplikacji pod zdarzeniem onCreate.

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

Mój przykładowy projekt Cordova wygląda następująco:

package com.apps.demo;
import android.os.Bundle;
import android.view.WindowManager;
import org.apache.cordova.*;

public class ScanManActivity extends DroidGap {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        super.loadUrl("http://stackoverflow.com");
    }
}

Po tym czasie moja aplikacja nie zasypiała, gdy była otwarta. Dzięki za odpowiedź kierujemy się do xSus.

dogatoniczny
źródło
to była najlepsza opcja moim zdaniem ... +1
Amit
Robi to samo, co odpowiedź Witka, jedyną różnicą jest to, że umieszczasz to w pliku „.java” zamiast w pliku „.xml” ;-)
tiktak
A co z pozwoleniem? Czy to wymaga pozwolenia?
Mehdi Khademloo
@Mehdi Khademloo to nie wymaga pozwolenia.
Wessam El Mahdy,
17

Ustaw flagi w oknie działania, jak poniżej

@Override public void onResume() {
 super.onResume();
 getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}

@Override public void onPause() {
 super.onPause();
 getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}
arjun
źródło
6

Z poziomu powłoki głównej (np. Powłoki adb) możesz zablokować za pomocą:

echo mylockname >/sys/power/wake_lock    

Po czym urządzenie pozostanie w stanie uśpienia, dopóki:

echo mylockname >/sys/power/wake_unlock    

Z tym samym ciągiem znaków dla „mylockname”.

Pamiętaj, że nie zapobiegnie to czarnemu ekranowi, ale zapobiegnie spaniu procesora.

Zauważ, że / sys / power / wake_lock jest do odczytu i zapisu dla radia użytkownika (1001) i systemu grupowego (1000) i oczywiście roota.

Odniesienie jest tutaj: http://lwn.net/Articles/479841/

jelle foks
źródło
3

to, co powiedział @eldarerathis, jest poprawne we wszystkich aspektach, blokada wybudzenia to właściwy sposób na zabezpieczenie urządzenia przed zasypianiem.

Nie wiem, co musi zrobić aplikacja, ale naprawdę ważne jest , aby zastanowić się, jak zaprojektować swoją aplikację, aby nie zmuszać telefonu do czuwania dłużej, niż potrzebujesz, w przeciwnym razie żywotność baterii ogromnie ucierpi.

Chciałbym wskazać ten naprawdę dobry przykład, jak używać AlarmManagerdo wywoływania zdarzeń i wybudzania telefonu i (Twojej aplikacji), aby wykonać to, co musisz zrobić, a następnie ponownie iść spać: Menedżer alarmów (źródło: commonsware.com)

lucabox
źródło
Istnieją aplikacje użytkowe specjalnie i celowo przeznaczone do rozładowania baterii. Kiedyś potrzebowałem. Zasadniczo pobierałoby wakelocks, wibruje jak szalone, włącza latarkę, zwiększa jasność itp. Więc tak, są aplikacje, które to wykorzystują. Ale to było poza tematem, więc wybacz mi
TheRealChx101
0

Jeśli jesteś użytkownikiem platformy Xamarin, oto rozwiązanie:

   protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle); //always call superclass first

        this.Window.AddFlags(WindowManagerFlags.KeepScreenOn);

        LoadApplication(new App());
    }
hogarth45
źródło