Làm cách nào để ngăn thiết bị Android chuyển sang chế độ ngủ?


155

Làm cách nào để ngăn thiết bị Android chuyển sang chế độ ngủ?

Câu trả lời:


133

Một lựa chọn là sử dụng khóa đánh thức . Ví dụ từ các tài liệu:

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

Ngoài ra còn có một bảng trên trang này mô tả các loại wakelocks khác nhau.

Hãy lưu ý rằng một số thận trọng cần được thực hiện khi sử dụng khóa đánh thức. Đảm bảo rằng bạn luôn release()khóa khi bạn hoàn thành với nó (hoặc không ở phía trước). Nếu không, ứng dụng của bạn có khả năng gây hao pin nghiêm trọng và sử dụng CPU.

Tài liệu này cũng chứa một trang hữu ích mô tả các cách tiếp cận khác nhau để giữ cho thiết bị luôn hoạt động và khi nào bạn có thể chọn sử dụng một phương pháp. Nếu "ngăn không cho thiết bị đi ngủ" chỉ liên quan đến màn hình (và không giữ CPU hoạt động) thì khóa thức có lẽ là nhiều hơn bạn cần.

Bạn cũng cần chắc chắn rằng bạn đã đặt quyền WAKE_LOCK trong tệp kê khai của mình để sử dụng phương thức này.


21
Bạn không nên sử dụng điều này nữa vì phương pháp này hiện không được chấp nhận. Hãy xem một trong những câu trả lời khác.
DuKes0mE

4
Vẫn còn một số lý do để sử dụng wakelocks, như nếu thiết bị được dành riêng cho một ứng dụng cụ thể và cần chạy ngay cả khi được thu nhỏ.
Muz

2
PowerManager.PARTIAL_WAKE_LOCK không bị phản đối và tôi nghĩ đó là phương pháp hiệu quả nhất. Nó cho phép người dùng nhấn nút nguồn nhưng CPU vẫn sẽ bật cho đến khi người dùng giải phóng cuộc gọi ();
Mansour Fahad

Tài liệu chính thức cho biết "Nếu bạn cần giữ CPU hoạt động để hoàn thành một số công việc trước khi thiết bị đi ngủ, bạn có thể sử dụng tính năng dịch vụ hệ thống PowerManager có tên là khóa đánh thức."
Joaquin Iurchuk

Đây là cách tuyệt vời, nhưng nó không được chấp nhận. vui lòng kiểm tra câu trả lời này: stackoverflow.com/a/22447615/5327912
Parth Anjaria

239

Nếu bạn chỉ muốn ngăn chế độ ngủ trên một chế độ cụ thể View, chỉ cần gọi setKeepScreenOn(true)vào đó Viewhoặc đặt thuộc keepScreenOntính true. Điều này sẽ ngăn màn hình tắt trong khi Viewtrên màn hình. Không có sự cho phép đặc biệt cần thiết cho việc này.


18
Ngoài ra, điều này sẽ không buộc điện thoại phải tỉnh táo ngoài vòng đời của ứng dụng. Bạn có thể gặp vấn đề đó với WakeLock.
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz 2/212

2
Vâng, trong hầu hết các trường hợp, đây là cách tiếp cận tốt hơn.
Edward Falk

8
Đây phải là câu trả lời được lựa chọn. Đơn giản, sạch sẽ và như Android dự định. Cảm ơn bạn.
Lior Iluz

2
"Sử dụng android: keepScreenOn =" true "tương đương với việc sử dụng FLAG_KEEP_SCREEN_ON. Bạn có thể sử dụng phương pháp nào là tốt nhất cho ứng dụng của mình. Ưu điểm của việc đặt cờ theo chương trình trong hoạt động của bạn là nó cung cấp cho bạn tùy chọn xóa cờ theo chương trình sau đó do đó cho phép màn hình tắt "- developer.android.com/training/schedcing/wakelock.html
Antonino

Lưu ý rằng setKeepScreenOn(true)sẽ chỉ có hiệu lực khi Viewnhìn thấy.
Jeff T.

121

Tôi tìm thấy một giải pháp làm việc khác: thêm dòng sau vào ứng dụng của bạn trong sự kiện onCreate.

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

Dự án Cordova mẫu của tôi trông như thế này:

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

Sau đó, ứng dụng của tôi sẽ không đi ngủ trong khi nó được mở. Cảm ơn vì anwer đã đến xSus.


theo ý kiến ​​của tôi, đây là lựa chọn tốt nhất ... +1
Amit

Điều này không giống như câu trả lời Witek, sự khác biệt duy nhất là bạn đặt điều này trong một tập tin ".java" thay vì một ".xml" một ;-)
tiktak

Làm thế nào về sự cho phép? Có cần phải xin phép không?
Mehdi Khademloo

@Mehdi Khademloo nó không cần sự cho phép.
Wessam El Mahdy


17

Đặt cờ trên Cửa sổ Hoạt động như bên dưới

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

6

Từ vỏ gốc (ví dụ vỏ adb), bạn có thể khóa bằng:

echo mylockname >/sys/power/wake_lock    

Sau đó, thiết bị sẽ tỉnh táo, cho đến khi bạn làm:

echo mylockname >/sys/power/wake_unlock    

Với cùng một chuỗi cho 'mylockname'.

Lưu ý rằng điều này sẽ không ngăn màn hình chuyển sang màu đen, nhưng nó sẽ ngăn CPU ngủ.

Lưu ý rằng / sys / power / Wake_lock là đọc-ghi cho radio người dùng (1001) và hệ thống nhóm (1000), và, tất nhiên, root.

Một tài liệu tham khảo có tại đây: http://lwn.net/Articles/479841/


3

Những gì @eldarerathis nói là chính xác về mọi mặt, khóa thức là cách giữ thiết bị không đi ngủ.

Tôi không biết ứng dụng của bạn cần phải làm gì nhưng điều thực sự quan trọng là bạn nghĩ về cách kiến ​​trúc sư ứng dụng của bạn để bạn không buộc điện thoại phải thức nhiều hơn mà bạn cần, hoặc thời lượng pin sẽ bị ảnh hưởng rất lớn.

Tôi sẽ chỉ cho bạn ví dụ thực sự tốt này về cách sử dụngAlarmManager để kích hoạt các sự kiện và đánh thức điện thoại và (ứng dụng của bạn) để thực hiện những gì bạn cần làm và sau đó đi ngủ lại: Trình quản lý báo thức (nguồn: commonsware.com)


Có những ứng dụng tiện ích đặc biệt và có chủ đích nhằm tiêu hao pin. Tôi đã có nhu cầu một lần. Về cơ bản, nó sẽ có được wakelocks, rung như điên, bật đèn pin, tăng độ sáng, v.v ... Vì vậy, có, có những ứng dụng sử dụng điều này. Nhưng điều này không đúng chủ đề nên hãy tha thứ cho tôi
TheRealChx101

0

Nếu bạn là người dùng Xamarin, đây là giải pháp:

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

        this.Window.AddFlags(WindowManagerFlags.KeepScreenOn);

        LoadApplication(new App());
    }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.