【问题标题】:How to prevent automatic screen lock on android by code?如何通过代码防止android上的自动屏幕锁定?
【发布时间】:2012-07-05 12:27:54
【问题描述】:

在我的应用中有一个很长的加载过程,如果设备锁定屏幕,我的过程会因某种原因停止。

如何防止设备自动锁屏?

【问题讨论】:

    标签: android android-screen android-screen-support


    【解决方案1】:

    另一种无需在清单中请求权限即可保持屏幕锁定的方法是:

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

    您是否在 UI 线程中进行长时间的加载过程?有些事情似乎不对 - 如果进程太长以至于屏幕锁定超时并且您的进程结束,那么它可能需要进入后台服务。

    【讨论】:

    • 如果需要,如何再次禁用此标志?
    • 试试 getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
    【解决方案2】:

    您必须在 AndroidManifest 上声明此使用权限:

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

    在你的代码活动中:

    PowerManager powerManager = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
    WakeLock wakeLock = powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK, "My Lock");
    wakeLock.acquire();
    

    当你的应用程序暂停或销毁时,请记住释放这个锁:

    wakeLock.release();
    

    通常建议在你的activity的onResume()中调用acquire方法和onPause中的release方法()。这样我们就可以保证我们的应用在被暂停或恢复的情况下仍然表现良好。

    【讨论】:

    • FULL_WAKE_LOCK 自 API 17 以来已被弃用,FLAG_KEEP_SCREEN_ON 现在是要走的路:)
    • PARTIAL_WAKE_LOCK 可能更合适,因为它可以防止问题中的行为(停止前台应用程序),但没有其他(例如保持显示) i>)。
    【解决方案3】:

    XML方式:

    只需在您的父布局中使用keepScreenOn 属性:

    <androidx.constraintlayout.widget.ConstraintLayout
            xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:app="http://schemas.android.com/apk/res-auto"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:keepScreenOn="true">
    

    以编程方式:

    您可以通过添加标志以编程方式设置它:

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

    【讨论】:

      【解决方案4】:
      KeyguardManager keyguardManager = (KeyguardManager)getSystemService(Activity.KEYGUARD_SERVICE);
      KeyguardLock lock = keyguardManager.newKeyguardLock(KEYGUARD_SERVICE);
      lock.disableKeyguard();
      

      在 androidmanifest 中:

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

      关注this link

      【讨论】:

        【解决方案5】:

        以下行允许您的手机在应用处于前台时处于开机状态

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

        以下说明允许我们在按下锁定按钮时禁用锁定屏幕。 API 级别 13 中不推荐使用 KeyguardLock 类

        /*onCreate*/
        KeyguardManager keyguardManager = (KeyguardManager)getSystemService(Activity.KEYGUARD_SERVICE);
        KeyguardLock lock = keyguardManager.newKeyguardLock(KEYGUARD_SERVICE); // Deprecated :/
        lock.disableKeyguard();
        

        在你的清单中:

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

        【讨论】:

          【解决方案6】:

          尚未提及的一个有趣的选项是

          View#setKeepScreenOn(boolean onOff)
          

          方法。这实际上可以在应用程序运行时的任何时候动态使用,例如用于根据应用状态设置屏幕模式

          【讨论】:

            【解决方案7】:

            使用密钥保护代码完美运行,

            只需将代码粘贴到您的 mainactivity 文件中的 onCreate 方法中,然后 android清单文件中的权限

            【讨论】:

            • 对另一个答案的支持应该通过投票来公开,而不是通过创建答案。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-01-20
            • 1970-01-01
            相关资源
            最近更新 更多