Android在应用程序运行时禁用屏幕超时


Answers:


172

您想使用如下形式:

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

4
这使它适合正在运行的活动或整个应用程序?
Muhammed Refaat 2014年

@ MayurR.Amipara是的,我认为这里就是这种情况
Muhammed Refaat

1
如果我在Application类的onCreate()方法中编写此代码,那么它将适用于整个应用程序吗?
Jayesh

如果否,那么我如何通过插入更少的代码而不是在每个活动中添加该行来保持整个应用程序的屏幕显示。
Jayesh

1
@Jayesh:您可以创建一个baseActivity并在onCreate方法中编写此代码,并扩展baseActivity的所有活动。
maryam

102

我用了:

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

禁用屏幕超时和

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

重新启用它。


83

Google还推荐一种XML方式:

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

查看Google幻灯片 -幻灯片16。

“如果忘记了唤醒锁,则代价很高(...)考虑使用android:keepScreenOn以确保正确性”


2
对于那些没有时间阅读链接的pdf的人:“如果忘记了唤醒锁,则代价很高”,“请考虑使用android:keepScreenOn来确保正确性”。
lenrok258 '16

2
@ lenrok258添加到答案;-)
neteinstein '16

在使用PowerManager.newWakeLockgetWindow().addFlags出于某种原因没有工作,这做到了。
本杰明·巴斯马奇


3

只需将下面一行添加到您MainActivity的应用中,您的应用就永远不会关闭灯。

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

2

在View中,以我的情况为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 2012年

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
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);是适用于本机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

这可以通过获取唤醒锁来完成。

我没有亲自测试过,但是这里有一个小教程。


10
不不不。唤醒锁很容易被滥用,如果使用不当,可能会耗尽用户的电池电量。使用View#setKeepScreenOn或等效的xml布局属性,android:keepScreenOn="true"
adamp 2010年

5
@adamp:OP没有表明他的应用是活动还是服务。活动应使用您引用的机制。服务应使用WakeLock
CommonsWare 2010年

感谢它不是一种服务。它类似于图片查看器,我只是不希望屏幕变暗。

@adamp:android:keepScreenOn="true"我认为您的提及是活动的唯一有效答案。除非绝对必要,否则请远离唤醒锁。
pauluss86 2012年

不仅是活动,还包括显示窗口的任何类型的UI。使用相应的窗口标志的公认答案同样有效。
adamp 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.