Android ปิดการหมดเวลาหน้าจอขณะที่แอปกำลังทำงาน


117

มีวิธีปิดการใช้งานสกรีนเซฟเวอร์ในขณะที่แอพของฉันกำลังทำงานอยู่หรือไม่?

การหรี่แสงของหน้าจอคือสิ่งที่ฉันหมายถึง


3
แล้วการใช้View.setKeepScreenOn()[link] [1] ล่ะ? ฉันไม่เคยใช้มันด้วยตัวเองเลย [1]: developer.android.com/reference/android/view/…
dorzey

3
อาจซ้ำกันได้ของForce Screen On
Richard Ev

คำตอบ:


173

คุณต้องการใช้สิ่งนี้:

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

4
สิ่งนี้ทำให้เป็นกิจกรรมการวิ่งหรือทั้งแอพ?
Muhammed Refaat

@ MayurR Amipara ใช่ฉันคิดว่าเป็นเช่นนี้
Muhammed Refaat

1
ถ้าฉันเขียนโค้ดนี้ใน Application class onCreate () method มันจะใช้ได้กับทั้งแอพหรือไม่
Jayesh

ถ้าไม่ใช่ฉันจะเปิดหน้าจอแอปทั้งหมดได้อย่างไรโดยการใส่รหัสน้อยลงแทนที่จะเพิ่มบรรทัดนั้นในแต่ละกิจกรรม
Jayesh

1
@Jayesh: คุณสามารถสร้าง baseActivity และเขียนโค้ดนี้ใน onCreate Method และขยายกิจกรรมทั้งหมดจาก baseActivity
maryam

102

ฉันใช้:

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

เพื่อปิดการหมดเวลาหน้าจอและ

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

เพื่อเปิดใช้งานอีกครั้ง


87

นอกจากนี้ยังมีวิธี XML ที่ Google แนะนำ:

<LinearLayout
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:keepScreenOn="true">

ตรวจสอบGoogle สไลด์ - สไลด์ 16

"Wakelocks มีค่าใช้จ่ายสูงหากลืม (... ) พิจารณาใช้ android: keepScreenOn เพื่อให้แน่ใจว่าถูกต้อง"


2
สำหรับผู้ที่ไม่มีเวลาอ่านไฟล์ PDF ที่เชื่อมโยง: "Wakelocks มีค่าใช้จ่ายสูงหากลืม" "ลองใช้ android: keepScreenOn เพื่อให้แน่ใจว่าถูกต้อง"
lenrok258

2
@ lenrok258 เพิ่มในคำตอบ ;-)
neteinstein

ในขณะที่ใช้PowerManager.newWakeLockและgetWindow().addFlagsไม่ได้ผลด้วยเหตุผลบางประการสิ่งนี้ได้
Benjamin Basmaci



2

ในมุมมองในกรณีของฉันเป็นคลาสย่อย SurfaceView คุณสามารถตั้งค่าหน้าจอให้เปิดตลอดเวลาได้ ฉันต้องการให้หน้าจอยังคงเปิดอยู่ในขณะที่มุมมองนี้ยังคงวาดภาพอยู่

public class MyCoolSurfaceView extends SurfaceView { 
@Override
protected void onAttachedToWindow (){
    super.onAttachedToWindow();
    this.setKeepScreenOn(true);
}

@Override
protected void onDetachedFromWindow(){
    super.onDetachedFromWindow();
    this.setKeepScreenOn(false);
}

1
ที่จริงซับซ้อนกว่าที่จำเป็น เพียงแค่เรียก setKeepsScreenOn (true) ที่ใดก็ได้จากนั้นเฟรมเวิร์กจะดูแลโดยอัตโนมัติเมื่อเปิดหน้าจอเมื่อหน้าต่างของคุณกำลังแสดง
hackbod

1

วางไว้ที่ onStart

    PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
    wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "no sleep");
    wakeLock.acquire();

และสิ่งนี้ที่คุณประจักษ์

    <uses-permission android:name="android.permission.WAKE_LOCK" />

อย่าลืม

wakeLock.release();

ที่ onStop


1
PARTIAL_WAKE_LOCKทำให้หน้าจอดับลง
Michael

1

นี่คือวิธีที่ดีที่สุดในการแก้ปัญหานี้

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

ทำไมต้อง FLAG_FULLSCREEN เพื่อตอบคำถามนี้
อับดุลวาแซ

0
android:keepScreenOn="true"

เป็นวิธีที่ดีกว่าในการจัดการสิ่งนี้หากเราต้องการให้หน้าจอใด ๆ ตื่นตัวตลอดเวลามิฉะนั้นเราจะต้องจัดการตัวเองเมื่อจะเปิดใช้งานและปิดการใช้งาน

https://developer.android.com/training/scheduling/wakelock.html


0
procedure SetSleep(aEnable:Boolean);
var
    vFlags: integer;
begin
    vFlags := TJWindowManager_LayoutParams.JavaClass.FLAG_TURN_SCREEN_ON or
        TJWindowManager_LayoutParams.JavaClass.FLAG_DISMISS_KEYGUARD or
        TJWindowManager_LayoutParams.JavaClass.FLAG_SHOW_WHEN_LOCKED or
        TJWindowManager_LayoutParams.JavaClass.FLAG_KEEP_SCREEN_ON;

    if aEnable then
    begin
      CallInUIThread (   // uses FMX.Helpers.Android
      procedure
      begin
        TAndroidHelper.Activity.getWindow.setFlags (vFlags, vFlags);
      end );
    end
    else
      CallInUIThread (
      procedure
      begin
        TAndroidHelper.Activity.getWindow.clearFlags (vFlags);
      end );
end;

0

1.getWindow (). addFlags (WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); เป็นทางออกที่ดีที่สุดสำหรับ Native Android
2. หากคุณต้องการทำกับแอปพลิเคชัน React android โปรดใช้รหัสด้านล่าง

@ReactMethod
    public void activate() {
        final Activity activity = getCurrentActivity();
        if (activity != null) {
            activity.runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
                }
            });
        }

    }

-1

ซึ่งสามารถทำได้โดยรับ Wake Lock

ฉันไม่ได้ทดสอบด้วยตัวเอง แต่นี่เป็นบทแนะนำเล็ก ๆ เกี่ยวกับเรื่องนี้


10
ไม่ไม่ไม่. ล็อคการปลุกใช้งานในทางที่ผิดได้ง่ายและอาจทำให้แบตเตอรี่ของผู้ใช้หมดหากไม่ใช้อย่างระมัดระวัง ใช้View#setKeepScreenOnหรือเทียบเท่าแอตทริบิวต์โครงร่าง xml,android:keepScreenOn="true"
adamp

5
@adamp: OP ไม่ได้ระบุว่าแอปของเขาเป็นกิจกรรมหรือบริการ กิจกรรมควรใช้กลไกที่คุณอ้างถึง บริการควรใช้ไฟล์WakeLock.
CommonsWare

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

@adamp: การกล่าวถึงของคุณandroid:keepScreenOn="true"เป็นคำตอบเดียวที่ถูกต้องสำหรับกิจกรรมในความคิดของฉัน อยู่ห่างจาก wakelocks เว้นแต่จำเป็นจริงๆ
pauluss86

ไม่ใช่แค่กิจกรรมเท่านั้น แต่ยังมี UI ทุกประเภทที่แสดงหน้าต่าง คำตอบที่ยอมรับของการใช้แฟล็กหน้าต่างที่เกี่ยวข้องนั้นถูกต้องเท่าเทียมกัน
adamp
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.