在Android 7.0及更低版本上,禁用锁定屏幕不得在30秒后触发待机屏幕

Jim*_*nts 6 android android-wake-lock kotlin

我编写了一种方法来禁用Android锁定屏幕,并使屏幕从待机状态(用于拨号)打开。此方法可正常工作30秒,但随后会触发待机屏幕,该屏幕短暂闪烁。这会触发onPause,onStop,onResume。这不应该发生。哪个标志不正确?实施必须从最新的Android版本开始,直到API 19。

此错误仅在<8.0以下的Android设备上发生。

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    disableLockScreen(this)
    setContentView(R.layout.activity_main)
    Log.i("AppLifecycleTest", "onCreate")
}

override fun onResume() {
    super.onResume()
    Log.i("AppLifecycleTest", "onResume")
}

override fun onPause() {
    super.onPause()
    Log.i("AppLifecycleTest", "onPause")
}

override fun onStop() {
    super.onStop()
    Log.i("AppLifecycleTest", "onStop")
}

override fun onDestroy() {
    super.onDestroy()
    Log.i("AppLifecycleTest", "onDestroy")
}

@Suppress("DEPRECATION")
private fun disableLockScreen(activity: Activity) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
        activity.setShowWhenLocked(true)
        activity.setTurnScreenOn(true)
    }
    val lock =
        (activity.getSystemService(Activity.KEYGUARD_SERVICE) as KeyguardManager).newKeyguardLock(Context.KEYGUARD_SERVICE)
    val powerManager = activity.getSystemService(Context.POWER_SERVICE) as PowerManager
    val wake = powerManager.newWakeLock(
        PowerManager.FULL_WAKE_LOCK or
                PowerManager.ACQUIRE_CAUSES_WAKEUP or
                PowerManager.ON_AFTER_RELEASE,
        "Beterdichtbij:BusSnoozeAlarm"
    )

    lock.disableKeyguard()
    // This timeout doesn't seem to do anything
    wake.acquire(6 * 1000L)

    activity.window.addFlags(
        WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
                or WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
                or WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
                or WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
                or WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON
    )
}
Run Code Online (Sandbox Code Playgroud)

启动条件:从内存中删除App并启动,以使屏幕处于活动状态。

LGE Nexus 5X:(Android 7.0,API 24)恰好30秒后屏幕快速闪烁并显示待机菜单,并且切换按钮消失。这会触发onPause,onStop,onResume。这不应该发生。

2019-05-07 10:14:40.613 AppLifecycleTest: onCreate
2019-05-07 10:14:40.616 AppLifecycleTest: onResume
2019-05-07 10:15:10.851 AppLifecycleTest: onPause
2019-05-07 10:15:10.891 AppLifecycleTest: onStop
2019-05-07 10:15:10.994 AppLifecycleTest: onResume
Run Code Online (Sandbox Code Playgroud)

三星Galaxy S8:(Android 8.0,API 26)在不与屏幕互动30秒后,切换按钮消失,但没有触发应用程序生命周期,也没有快速闪烁待机屏幕。这是对的。

2019-05-07 10:23:22.654 AppLifecycleTest: onCreate
2019-05-07 10:23:22.717 AppLifecycleTest: onResume
Run Code Online (Sandbox Code Playgroud)

这个SO线程也有同样的问题,onStop在30秒后触发。

这是我的解决方法,可以解决但不符合文档的要求:

// add to onCreate
private fun initTimer() {
    timer = Timer()
    timer.schedule(25000L) {
        activity.runOnUiThread {
            disableLockScreen(activity)
            initTimer()
            Log.i("AppLifecycleTest", "reset every 25 Seconds")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Aka*_*bey 0

您只需在activity_main.xml文件中写入即可使屏幕始终保持打开状态。

android:keepScreenOn="true"
Run Code Online (Sandbox Code Playgroud)