Экран блокировки запускает события жизненного цикла приложения различной активности - PullRequest
0 голосов
/ 12 февраля 2019

Когда я получаю Push-сообщение в службе, которая расширяет FirebaseMessagingService, и я запускаю Activity в этом классе, тогда выполняются следующие события / методы жизненного цикла:

  • Push Message запускает VideoRingingActivity
  • Запуск VideoRingingActivity
  • onCreate
  • disableLockScreen
  • Экран переключается с черного на экран блокировки, поэтому он не показывает VideoRingingActivity
  • onStart
  • onResume
  • onPause
  • onStop
  • Теперь отображается фактическая активность VideoRingingActivity?Я ожидал, что это появится после setContentView (R.layout.activity_video_ringing)
  • onRestart
  • onStart
  • onResume

, который я разработал нижеОбходное решение, где я добавляю логическое значение, чтобы определить, включен ли экран.Но это хакерство, и когда экран включен в режиме блокировки, он не работает.

Потому что, когда экран не выключен, отображается MainActivity и получено push-сообщение, поведениеповедение по умолчанию жизненного цикла и, следовательно, правильно.Вот тот же процесс, когда экран включен и отображается MainActivity:

  • onCreate
  • onStart
  • onResume

Thisявляется правильным и ожидаемым.

class VideoRingingActivity : BaseActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        if (ViewUtils.isScreenActive(activity)) {
            screenIsNotLocked = true
        }
        ViewUtils.disableLockScreen(this)
        binding = DataBindingUtil.setContentView(this, R.layout.activity_video_ringing)
    }

    override fun onStart() {
        super.onStart()
        if (screenIsNotLocked) {
        }
    }

    override fun onResume() {
        super.onResume()
        if (screenIsNotLocked) {
        }
    }

    override fun onPause() {
        super.onPause()
        if (screenIsNotLocked) {
        }
    }

    override fun onStop() {
        super.onStop()
        if (screenIsNotLocked) {
        }
        screenIsNotLocked = true
    }
}

open class ViewUtils {

    @JvmStatic
    @Suppress("DEPRECATION")
    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, "BusSnoozeAlarm")

        lock.disableKeyguard()
        wake.acquire(TIMEOUT)

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

    @Suppress("DEPRECATION")
    fun isScreenActive(context: Context): Boolean {
        val powerManager = context.getSystemService(POWER_SERVICE) as PowerManager
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH) {
            return powerManager.isInteractive
        } else {
            return powerManager.isScreenOn
        }
    }
}

ОБНОВЛЕНИЕ: Существует еще один поток SO с аналогичной проблемой, но решение устарело и не учитывает угловой случай, когдаэкран активен в режиме блокировки экрана:

OnPause и OnStop () вызываются сразу после начала активности

Почему метод onPause вызывается сразу после onCreate

...