Отключение экрана блокировки не должно вызывать экран ожидания через 30 секунд на Android 7.0 и ниже - PullRequest
6 голосов
/ 06 мая 2019

Я написал метод, который отключает экран блокировки Android и заставляет экран включаться из режима ожидания (для набора номера).Этот метод работает правильно в течение 30 секунд, но затем он вызывает экран ожидания, который кратковременно мигает.Это вызывает onPause, onStop, onResume.Что не должно случиться.Какой флаг не правильный?Реализация должна работать с последней версии Android до API 19.

Эта ошибка возникает только на устройствах Android <8.0. </strong>

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
    )
}

Условие запуска: удалить приложение из памяти изапустить, чтобы экран был активным.

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

Samsung 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

Этот поток 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")
        }
    }
}

1 Ответ

0 голосов
/ 16 мая 2019

Вам просто нужно записать в файл activity_main.xml, чтобы экран всегда был включен.

android:keepScreenOn="true"
...