ฉันจะป้องกันไม่ให้อุปกรณ์ Android เข้าสู่โหมดสลีปโดยทางโปรแกรมได้อย่างไร
ฉันจะป้องกันไม่ให้อุปกรณ์ Android เข้าสู่โหมดสลีปโดยทางโปรแกรมได้อย่างไร
คำตอบ:
ทางเลือกหนึ่งคือการใช้ล็อคตื่น ตัวอย่างจากเอกสาร:
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ในรายการของคุณเพื่อใช้วิธีนี้
หากคุณเพียงแค่ต้องการที่จะป้องกันไม่ให้โหมดนอนในที่เฉพาะเจาะจงViewเพียงโทรsetKeepScreenOn(true)ในที่Viewหรือตั้งค่าคุณสมบัติการkeepScreenOn trueสิ่งนี้จะป้องกันไม่ให้หน้าจอดับลงในขณะที่Viewอยู่บนหน้าจอ ไม่จำเป็นต้องได้รับอนุญาตพิเศษสำหรับสิ่งนี้
setKeepScreenOn(true)จะมีผลเฉพาะเมื่อViewมองเห็นได้
ฉันพบโซลูชันอื่นที่ใช้งานได้: เพิ่มบรรทัดต่อไปนี้ในแอปของคุณภายใต้เหตุการณ์ 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
android:keepScreenOn="true" อาจเป็นตัวเลือกที่ดีกว่าที่จะมีจาก XML โครงร่าง
ข้อมูลเพิ่มเติม: https://developer.android.com/training/scheduling/wakelock.html
ตั้งค่าสถานะในหน้าต่างกิจกรรมเป็นด้านล่าง
@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);
}
จากรูทเชลล์ (เช่น 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/
สิ่งที่ @ Eldarathis พูดถูกต้องในทุกด้านล็อคการปลุกเป็นวิธีที่เหมาะสมในการป้องกันไม่ให้อุปกรณ์เข้าสู่โหมดสลีป
ฉันไม่รู้ว่าคุณต้องทำแอพไหนแต่มันสำคัญมากที่คุณจะต้องคิดว่าจะออกแบบแอพของคุณอย่างไรเพื่อที่คุณจะไม่บังคับให้โทรศัพท์ตื่นตัวนานกว่าที่คุณต้องการหรือแบตเตอรี่จะต้องทนทุกข์อย่างมากมาย
ฉันจะชี้ให้คุณเป็นตัวอย่างที่ดีมากเกี่ยวกับวิธีใช้AlarmManagerในการเริ่มเหตุการณ์และปลุกโทรศัพท์และ (แอปของคุณ) เพื่อทำสิ่งที่คุณต้องทำแล้วไปนอนอีกครั้ง: ตัวจัดการสัญญาณเตือน (แหล่งที่มา: commonsware.com)
หากคุณเป็นผู้ใช้ Xamarin นี่คือทางออก:
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle); //always call superclass first
this.Window.AddFlags(WindowManagerFlags.KeepScreenOn);
LoadApplication(new App());
}