Когда я получаю 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