Paksa Layar Aktif

Jawaban:

339

JANGAN GUNAKAN KUNCI BANGUN

Ini mengharuskan Anda memberi aplikasi Anda izin tambahan, dan sangat mudah untuk memperkenalkan bug di mana Anda secara tidak sengaja tetap memegang kunci layar dan membiarkan layar menyala.

Jauh, jauh lebih baik menggunakan bendera jendela FLAG_KEEP_SCREEN_ON, yang dapat Anda aktifkan di jendela aktivitas Anda onCreate()seperti ini:

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

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

Ini akan memastikan bahwa layar tetap menyala saat jendela Anda berada di latar depan, dan hanya saat berada di latar depan. Ini sangat menyederhanakan kasus penggunaan umum ini, menghilangkan semua juggling yang perlu Anda lakukan saat aplikasi Anda bertransisi antar status.

hackbod
sumber
5
Apakah itu mencegah perangkat tidur? Jika demikian, WAKE_LOCK menurut saya merupakan kesalahan yang mengejutkan!
Michael Cramer
32
Ya itu membuat layar menyala dan mencegah perangkat tidur.
hackbod
1
Ya, Anda dapat menghapus bendera, dengan API jendela yang sesuai. Anda tidak perlu khawatir membuat apa pun digambar, kerangka kerja akan melakukannya jika diperlukan.
hackbod
1
@hakbod: ini akan berfungsi untuk menjaga layar tetap hidup, tapi bagaimana dengan layar yang sedang tidur, apakah itu akan membangunkannya dan menjaganya tetap hidup ????
Kavitha
5
@ KC202 Anda dapat menggunakan WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON untuk membuat layar menyala saat jendela Anda ditampilkan. Juga sering digunakan dengan FLAG_DISMISS_KEYGUARD dan / atau FLAG_SHOW_WHEN_LOCKED.
hackbod
34

Pertanyaan ini Sudah Jawaban Hebat oleh @hackbod!

Saya Menjawab Pertanyaan ini dengan Dua Solusi Tambahan!

Solusi yang Ada:

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

Solusi Tambahan:

kita bisa menggunakan keepScreenOn

1. implementation menggunakansetKeepScreenOn() 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);
       }

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

2. Menambah keepScreenOnkexml 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" >

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

Catatan (Beberapa Poin Berguna):

1. Tidak masalah yang keepScreenOnharus digunakan di Main/Root/Parent View atasnya dapat digunakan dengan apa pun child viewakan berfungsi Seperti halnya bekerja diParent view

2. Satu-satunya masalah adalah bahwa View's Visibility must be visiblejika tidak, itu tidak akan berhasil!

Tarsem Singh
sumber
catatan v.setKeepScreenOn(true);tampaknya menjadi satu-satunya cara untuk melakukannya untuk bingkai dialog layar penuh
Tim
16

Solusi lain adalah menambahkan android:keepScreenOn="true"( dokumentasi ) ke tampilan yang perlu tetap mengaktifkan layar.

Memungkinkan kontrol yang lebih terperinci dalam hal tampilan mana yang tetap aktif dan mana yang tidak. Anda bahkan dapat mereferensikan setelan dari file sumber daya dengan cara ini.

Alexander Abramov
sumber