Wymuś włączenie ekranu

115

Jak wymusić, aby ekran pozostał aktywny i nie wyłączał się podczas działania mojej aplikacji?

bugzy
źródło
zobacz szczegółową odpowiedź tutaj .. stackoverflow.com/questions/5712849/…
Zar E Ahmer

Odpowiedzi:

339

PROSZĘ NIE UŻYWAĆ BLOKADY WAKE

Wymaga to nadania aplikacji dodatkowego pozwolenia i bardzo łatwo jest wprowadzić błędy, w których przypadkowo przytrzymujesz blokadę wybudzania, a tym samym pozostawiasz włączony ekran.

O wiele lepiej jest użyć flagi okna FLAG_KEEP_SCREEN_ON, którą możesz włączyć w oknie swojej aktywności w onCreate()następujący sposób:

@Override
protected void onCreate(Bundle icicle) {
    super.onCreate(icicle);

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

Dzięki temu ekran pozostanie włączony, gdy okno będzie na pierwszym planie i tylko wtedy, gdy będzie na pierwszym planie. To znacznie upraszcza ten typowy przypadek użycia, eliminując żonglowanie, które musisz wykonywać, gdy aplikacja przechodzi między stanami.

hackbod
źródło
5
Czy to uniemożliwia zasypianie urządzenia? Jeśli tak, powszechność funkcji WAKE_LOCK wydaje mi się szokującym błędem!
Michael Cramer
32
Tak, utrzymuje włączony ekran i zapobiega zasypianiu urządzenia.
hackbod
1
Tak, możesz usunąć flagę za pomocą odpowiedniego interfejsu API okna. Nie musisz się martwić o to, że coś zostanie narysowane, framework robi to w razie potrzeby.
hackbod
1
@hakbod: to działałoby, aby utrzymać ekran przy życiu, ale co z ekranem, który śpi, czy obudziłoby go i utrzymałby przy życiu ????
Kavitha
5
@ KC202 możesz użyć WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON, aby spowodować włączenie ekranu po wyświetleniu okna. Często używany z FLAG_DISMISS_KEYGUARD i / lub FLAG_SHOW_WHEN_LOCKED.
hackbod
34

To pytanie ma już świetną odpowiedź od @hackbod!

Odpowiadam na to pytanie dwoma dodatkowymi rozwiązaniami!

Istniejące rozwiązanie:

@Override
    protected void onCreate(Bundle icicle) {
        super.onCreate(icicle);    
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
    }

Dodatkowe rozwiązania:

możemy użyć keepScreenOn

1. implementation za pomocąsetKeepScreenOn() in java code

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // or any View (in case generated programmatically ) 
        View v = getLayoutInflater().inflate(R.layout.driver_home, null);

        v.setKeepScreenOn(true);
        setContentView(v);
       }

Dokumenty http://developer.android.com/reference/android/view/View.html#setKeepScreenOn(boolean)

2. Dodawanie keepScreenOndoxml layout

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:keepScreenOn="true" >

Dokumenty http://developer.android.com/reference/android/view/View.html#attr_android%3akeepScreenOn

Uwaga (kilka przydatnych punktów):

1. nie ma znaczenia, że keepScreenOnpowinno być na nim używane Main/Root/Parent View , może być używane z każdym child viewbędzie działać Tak samo, jak działaParent view

2. Jedyną rzeczą jest to, że View's Visibility must be visibleinaczej nie zadziała!

Tarsem Singh
źródło
uwaga v.setKeepScreenOn(true);wydaje się być jedynym sposobem na zrobienie tego w przypadku pełnoekranowego fragmentu dialogowego
Tim
16

Innym rozwiązaniem jest dodanie android:keepScreenOn="true"( dokumentacji ) do widoków, które muszą mieć włączony ekran.

Pozwala na nieco bardziej szczegółową kontrolę pod względem tego, które widoki pozostają, a które nie. W ten sposób możesz nawet odwołać się do ustawienia z pliku zasobów.

Alexander Abramov
źródło