ฉันจะป้องกันไม่ให้อุปกรณ์ Android เข้าสู่โหมดสลีปโดยทางโปรแกรมได้อย่างไร


155

ฉันจะป้องกันไม่ให้อุปกรณ์ Android เข้าสู่โหมดสลีปโดยทางโปรแกรมได้อย่างไร

คำตอบ:


133

ทางเลือกหนึ่งคือการใช้ล็อคตื่น ตัวอย่างจากเอกสาร:

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

นอกจากนี้ยังมีตารางในหน้านี้ที่อธิบาย wakelocks ประเภทต่างๆ

โปรดทราบว่าจำเป็นต้องใช้ความระมัดระวังบางอย่างเมื่อใช้ล็อคการปลุก ตรวจสอบให้แน่ใจว่าคุณrelease()ล็อคอยู่เสมอเมื่อทำเสร็จ (หรือไม่อยู่ด้านหน้า) มิฉะนั้นแอพของคุณอาจทำให้แบตเตอรี่หมดและใช้งาน CPU อย่างรุนแรง

เอกสารประกอบยังมีหน้าที่มีประโยชน์ที่อธิบายวิธีการต่าง ๆ ในการทำให้อุปกรณ์ตื่นตัวและเมื่อคุณอาจเลือกที่จะใช้ หาก "ป้องกันไม่ให้อุปกรณ์เข้าสู่โหมดสลีป" หมายถึงหน้าจอเท่านั้น (และไม่ทำให้ซีพียูทำงานอยู่) แสดงว่าล็อกการปลุกอาจมากกว่าที่คุณต้องการ

คุณต้องให้แน่ใจว่าคุณมีสิทธิ์WAKE_LOCKในรายการของคุณเพื่อใช้วิธีนี้


21
คุณไม่ควรใช้สิ่งนี้อีกต่อไปเนื่องจากวิธีนี้เลิกใช้แล้ว ลองดูที่หนึ่งในคำตอบอื่น ๆ
DuKes0mE

4
ยังคงมีเหตุผลบางอย่างที่จะใช้ wakelocks เช่นถ้าอุปกรณ์นั้นอุทิศให้กับแอพที่เฉพาะเจาะจงและต้องการที่จะทำงานแม้จะถูกย่อให้เล็กสุด
Muz

2
PowerManager.PARTIAL_WAKE_LOCK ไม่ได้คัดค้านและฉันคิดว่าเป็นวิธีที่มีประสิทธิภาพที่สุด อนุญาตให้ผู้ใช้กดปุ่มเปิดปิด แต่ CPU จะยังคงเปิดอยู่จนกว่าผู้ใช้จะปล่อยสาย ();
Mansour Fahad

เอกสารอย่างเป็นทางการกล่าวว่า "หากคุณต้องการให้ซีพียูทำงานต่อไปเพื่อทำงานบางอย่างให้เสร็จก่อนที่อุปกรณ์จะเข้าสู่โหมดสลีปคุณสามารถใช้คุณสมบัติการบริการระบบ PowerManager ที่เรียกว่าล็อคการล็อกได้"
Joaquin Iurchuk

นี่เป็นวิธีที่ดี แต่ก็เลิกใช้แล้ว โปรดตรวจสอบคำตอบนี้: stackoverflow.com/a/22447615/5327912
Parth Anjaria

240

หากคุณเพียงแค่ต้องการที่จะป้องกันไม่ให้โหมดนอนในที่เฉพาะเจาะจงViewเพียงโทรsetKeepScreenOn(true)ในที่Viewหรือตั้งค่าคุณสมบัติการkeepScreenOn trueสิ่งนี้จะป้องกันไม่ให้หน้าจอดับลงในขณะที่Viewอยู่บนหน้าจอ ไม่จำเป็นต้องได้รับอนุญาตพิเศษสำหรับสิ่งนี้


18
นอกจากนี้สิ่งนี้จะไม่บังคับให้โทรศัพท์ตื่นตัวอยู่นอกช่วงชีวิตของแอปพลิเคชัน คุณสามารถพบปัญหาดังกล่าวกับ WakeLock
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz

2
ใช่ในกรณีส่วนใหญ่นี่เป็นวิธีที่ดีกว่า
Edward Falk

8
นี่ควรเป็นคำตอบที่เลือก ง่ายสะอาดและเป็น Android ตั้งใจ ขอบคุณ.
Lior Iluz

2
"การใช้ android: keepScreenOn =" true "เทียบเท่ากับการใช้ FLAG_KEEP_SCREEN_ON คุณสามารถใช้วิธีใดวิธีที่ดีที่สุดสำหรับแอปของคุณข้อดีของการตั้งค่าสถานะโดยทางโปรแกรมในกิจกรรมของคุณคือมันให้ตัวเลือกการล้างธงโดยทางโปรแกรม ดังนั้นการอนุญาตให้หน้าจอปิด "- developer.android.com/training/scheduling/wakelock.html
Antonino

โปรดทราบว่าsetKeepScreenOn(true)จะมีผลเฉพาะเมื่อViewมองเห็นได้
เจฟฟ์ที.

121

ฉันพบโซลูชันอื่นที่ใช้งานได้: เพิ่มบรรทัดต่อไปนี้ในแอปของคุณภายใต้เหตุการณ์ onCreate

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

ตัวอย่างโครงการ Cordova ของฉันมีลักษณะเช่นนี้:

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

หลังจากนั้นแอปของฉันจะไม่เข้าสู่โหมดสลีปในขณะที่เปิดอยู่ ขอบคุณสำหรับ anwer ไปที่ xSus


นี่เป็นตัวเลือกที่ดีที่สุดในความคิดของฉัน ... +1
Amit

สิ่งนี้จะเหมือนกับคำตอบของ Witek ความแตกต่างเพียงอย่างเดียวคือคุณใส่สิ่งนี้ลงในไฟล์ ".java" แทนที่จะเป็น ".xml" one ;-)
tiktak

ได้รับอนุญาตเกี่ยวกับวิธี? จำเป็นต้องได้รับอนุญาตหรือไม่?
Mehdi Khademloo

@Mehdi Khademloo ไม่ต้องการการอนุญาต
Wessam El Mahdy


17

ตั้งค่าสถานะในหน้าต่างกิจกรรมเป็นด้านล่าง

@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

จากรูทเชลล์ (เช่น adb เชลล์) คุณสามารถล็อคด้วย:

echo mylockname >/sys/power/wake_lock    

หลังจากนั้นอุปกรณ์จะยังคงทำงานจนกว่าคุณจะ:

echo mylockname >/sys/power/wake_unlock    

ด้วยสตริงเดียวกันสำหรับ 'mylockname'

โปรดทราบว่าการทำเช่นนี้จะไม่ป้องกันหน้าจอเป็นสีดำ แต่จะป้องกันไม่ให้ CPU เข้าสู่โหมดสลีป

โปรดทราบว่า / sys / power / wake_lock เป็นการอ่าน - เขียนสำหรับวิทยุผู้ใช้ (1001) และระบบกลุ่ม (1,000) และแน่นอนว่าเป็นรูท

การอ้างอิงอยู่ที่นี่: http://lwn.net/Articles/479841/


3

สิ่งที่ @ Eldarathis พูดถูกต้องในทุกด้านล็อคการปลุกเป็นวิธีที่เหมาะสมในการป้องกันไม่ให้อุปกรณ์เข้าสู่โหมดสลีป

ฉันไม่รู้ว่าคุณต้องทำแอพไหนแต่มันสำคัญมากที่คุณจะต้องคิดว่าจะออกแบบแอพของคุณอย่างไรเพื่อที่คุณจะไม่บังคับให้โทรศัพท์ตื่นตัวนานกว่าที่คุณต้องการหรือแบตเตอรี่จะต้องทนทุกข์อย่างมากมาย

ฉันจะชี้ให้คุณเป็นตัวอย่างที่ดีมากเกี่ยวกับวิธีใช้AlarmManagerในการเริ่มเหตุการณ์และปลุกโทรศัพท์และ (แอปของคุณ) เพื่อทำสิ่งที่คุณต้องทำแล้วไปนอนอีกครั้ง: ตัวจัดการสัญญาณเตือน (แหล่งที่มา: commonsware.com)


มีแอพยูทิลิตี้โดยเฉพาะและตั้งใจให้แบตเตอรี่หมด ฉันต้องการหนึ่งครั้ง โดยทั่วไปแล้วจะได้รับ wakelocks สั่นสะเทือนอย่างบ้าคลั่งเปิดไฟฉายเพิ่มความสว่าง ฯลฯ ดังนั้นใช่มีแอพที่ใช้ประโยชน์จากสิ่งนี้ แต่นี่เป็นหัวข้อที่ปิดดังนั้นให้อภัยฉัน
TheRealChx101

0

หากคุณเป็นผู้ใช้ Xamarin นี่คือทางออก:

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

        this.Window.AddFlags(WindowManagerFlags.KeepScreenOn);

        LoadApplication(new App());
    }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.