Bagaimana cara mencegah perangkat Android agar tidak tidur secara terprogram?

155

Bagaimana cara mencegah perangkat Android agar tidak tidur secara terprogram?

James
sumber

Jawaban:

133

Salah satu opsi adalah menggunakan kunci bangun . Contoh dari dokumen:

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();

Ada juga tabel di halaman ini yang menjelaskan berbagai jenis wakelocks.

Ketahuilah bahwa beberapa kehati-hatian perlu diperhatikan saat menggunakan kunci bangun. Pastikan Anda selalu release()mengunci saat selesai (atau tidak di latar depan). Jika tidak, aplikasi Anda dapat berpotensi menyebabkan baterai terkuras dan penggunaan CPU.

Dokumentasi juga berisi halaman yang bermanfaat yang menjelaskan berbagai pendekatan untuk membuat perangkat tetap terjaga, dan kapan Anda memilih untuk menggunakannya. Jika "mencegah perangkat tidur" hanya mengacu pada layar (dan tidak menjaga CPU aktif) maka kunci bangun mungkin lebih dari yang Anda butuhkan.

Anda juga perlu memastikan bahwa Anda memiliki izin WAKE_LOCK yang diatur dalam manifes Anda untuk menggunakan metode ini.

eldarerathis
sumber
21
Anda seharusnya tidak menggunakan ini lagi karena metode ini sudah usang sekarang. Lihatlah salah satu jawaban lain.
DuKes0mE
4
Masih ada beberapa alasan untuk menggunakan wakelocks, seperti jika perangkat ini didedikasikan untuk aplikasi tertentu dan perlu dijalankan bahkan ketika diminimalkan.
Muz
2
PowerManager.PARTIAL_WAKE_LOCK tidak ditinggalkan dan saya pikir ini metode yang paling efisien. Ini memungkinkan pengguna untuk menekan tombol daya tetapi CPU masih akan menyala sampai rilis panggilan pengguna ();
Mansour Fahad
Dokumentasi Resmi mengatakan, "Jika Anda harus tetap menjalankan CPU untuk menyelesaikan beberapa pekerjaan sebelum perangkat tidur, Anda dapat menggunakan fitur layanan sistem PowerManager yang disebut wake lock."
Joaquin Iurchuk
Ini cara yang bagus, tetapi sudah usang. silakan periksa jawaban ini: stackoverflow.com/a/22447615/5327912
Parth Anjaria
240

Jika Anda hanya ingin mencegah modus tidur pada spesifik View, hanya panggilan setKeepScreenOn(true)pada itu Viewatau mengatur keepScreenOnproperti untuk true. Ini akan mencegah layar mati saat Viewada di layar. Tidak diperlukan izin khusus untuk ini.

Witek
sumber
18
Juga ini tidak akan memaksa ponsel untuk tetap terjaga di luar masa hidup aplikasi. Anda dapat mengalami masalah itu dengan WakeLock.
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
2
Ya, dalam banyak kasus, ini adalah pendekatan yang lebih baik.
Edward Falk
8
Ini harus menjadi jawaban yang dipilih. Sederhana, bersih, dan sesuai keinginan Android. Terima kasih.
Lior Iluz
2
"Menggunakan android: keepScreenOn =" true "setara dengan menggunakan FLAG_KEEP_SCREEN_ON. Anda dapat menggunakan pendekatan mana pun yang terbaik untuk aplikasi Anda. Keuntungan dari pengaturan bendera secara terprogram dalam aktivitas Anda adalah memberi Anda pilihan untuk secara sistematis menghapus bendera di kemudian hari dan dengan demikian memungkinkan layar untuk mematikan "- developer.android.com/training/scheduling/wakelock.html
Antonino
Perhatikan bahwa setKeepScreenOn(true)efek hanya akan berlaku bila Viewterlihat.
Jeff T.
121

Saya menemukan solusi lain yang berfungsi: tambahkan baris berikut ke aplikasi Anda di bawah acara onCreate.

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

Proyek Cordova sampel saya terlihat seperti ini:

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");
    }
}

Setelah itu, aplikasi saya tidak akan tidur ketika sedang terbuka. Terima kasih atas jawabannya, masuk ke xSus.

dogatonis
sumber
ini adalah pilihan terbaik menurut saya ... +1
Amit
Ini melakukan hal yang sama dengan jawaban Witek, satu-satunya perbedaan adalah bahwa Anda meletakkan ini dalam file ".java" bukannya ".xml" ;-)
tiktak
Bagaimana dengan izin? Apakah ini memerlukan izin?
Mehdi Khademloo
@Mehdi Khademloo itu tidak perlu izin.
Wessam El Mahdy
17

Tetapkan bendera di Jendela Aktivitas seperti di bawah ini

@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
sumber
6

Dari shell root (mis. Adb shell), Anda dapat mengunci dengan:

echo mylockname >/sys/power/wake_lock    

Setelah itu perangkat akan tetap terjaga, sampai Anda melakukannya:

echo mylockname >/sys/power/wake_unlock    

Dengan string yang sama untuk 'mylockname'.

Perhatikan bahwa ini tidak akan mencegah layar menjadi hitam, tetapi itu akan mencegah CPU dari tidur.

Perhatikan bahwa / sys / power / wake_lock adalah read-write untuk radio pengguna (1001) dan sistem grup (1000), dan, tentu saja, root.

Referensi ada di sini: http://lwn.net/Articles/479841/

jelle foks
sumber
3

apa yang dikatakan @eldarerathis benar dalam semua aspek, kunci bangun adalah cara yang tepat untuk menjaga perangkat agar tidak tidur.

Saya tidak tahu apa yang perlu dilakukan aplikasi tetapi sangat penting bagi Anda untuk memikirkan bagaimana mendesain aplikasi Anda sehingga Anda tidak memaksa ponsel untuk tetap terjaga karena lebih banyak yang Anda butuhkan, atau masa pakai baterai akan sangat menderita.

Saya akan mengarahkan Anda ke contoh yang sangat bagus ini tentang cara menggunakan AlarmManageruntuk menyalakan acara dan membangunkan ponsel dan (aplikasi Anda) untuk melakukan apa yang perlu Anda lakukan dan kemudian tidur lagi: Manajer Alarm (sumber: commonsware.com)

lucabox
sumber
Ada aplikasi utilitas yang secara khusus dan sengaja dimaksudkan untuk menguras baterai. Saya perlu sekali saja. Pada dasarnya ia akan memperoleh wakelocks, bergetar seperti orang gila, menyalakan senter, meningkatkan kecerahan, dll. Jadi ya, ada aplikasi yang memanfaatkan ini. Tapi ini diluar topik, jadi maafkan saya
TheRealChx101
0

Jika Anda adalah pengguna Xamarin, ini solusinya:

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

        this.Window.AddFlags(WindowManagerFlags.KeepScreenOn);

        LoadApplication(new App());
    }
hogarth45
sumber