【问题标题】:Activity is calling onStop after onCreateActivity 在 onCreate 之后调用 onStop
【发布时间】:2020-06-30 19:45:04
【问题描述】:

我有 3 个活动:一个入职活动、一个登录活动和一个第三个活动。当用户第一次打开我的应用程序时,它会在登录活动后进入登录页面,它会要求使用 Firebase 登录谷歌。当用户这样做时,它将开始第三个活动并完成旧的活动,就像这样:

val intent = Intent(baseContext, SkyActivity::class.java)
startActivity(intent)
finish()

但每次用户登录并启动3rd activity 时,都会调用onPause()。它使应用程序崩溃,因为我的 onPause() 停止了我的背景歌曲:

override fun onPause() {
    super.onPause()
    if (backgroundSongService.isPlaying()) {
        backgroundSongService.pauseMusic()
    }
}

而此时,我的backgroundSongService 仍然是null(我在我的onCreate 中调用了一个初始化它的函数)。所以我得到了错误:

lateinit property backgroundSongService has not been initialized

但这仅在用户登录时发生。如果他在登录后关闭应用程序并再次打开,他仍然会登录。 所以活动流程将是:OnboardingActivity -> 3rdActivity

OnboardingActivity 将像这样调用第三个活动:

if (firebaseUser != null) {
    val intent = Intent(baseContext, SkyActivity::class.java)
    startActivity(intent)
    finish()
} 

就像我在LoginActivity 中的Intent。但不同的是,这一次,onPause 不会在第三个活动中被调用。为什么只在LoginActivity之后调用?

【问题讨论】:

  • 您不正确地使用lateinit。由于歌曲服务可能为空,因此它应该是一个可以为空的参数。然后,您可以对其使用安全调用。 backgroundSongService?.run{ if (isPlaying()) pauseMusic() }

标签: android android-studio kotlin android-intent android-activity


【解决方案1】:

快速解决您的崩溃问题

使用前验证后台服务不为空

override fun onPause() {
    super.onPause()
    if (backgroundSongService!=null && backgroundSongService.isPlaying()) {
        backgroundSongService.pauseMusic()
    }
}

【讨论】:

  • 但是pauseMusic() 在第三个活动中,而不是在前一个活动中。那么如何调用第二个活动的onPause() 并运行第三个活动的onPause() 内的代码呢?
  • 您在哪里登录?在第三次活动中?
  • onPause其实是它自己的activity引起的,而不是其他activity引起的。
  • onPause 仅在其他活动打开并将当前活动推送到暂停状态或调用 onBackpressed 时才会调用...
  • 登录在我的第二个活动中,pauseMusic() 在第三个活动的onPause() 中
猜你喜欢
  • 2014-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-04
相关资源
最近更新 更多