未调用未绑定和已停止的Service的onDestroy

时间:2017-09-18 22:14:38

标签: android service

onStart()中的Activity绑定到MusicPlayService,并且在其onStop()中取消绑定MusicPlayService。在它的onDestroy()中,它调用了stopService,但 MusicPlayService的onDestroy()根本没有调用

****** UPDATE:onDestroy()中的isFinishing是false。

如果按下Back按钮,activity :: onDestroy()的isFinishing == true,如果按home键,则调用onDestroy()(我检查了'不要保持活动'设置)但isFinishing = =假。

我想这是正确的行为,只有activity的finish()才会开始设置isFinishing == true。即使主页按钮将触发onDestroy(),操作系统仍可能认为这不是真正的“完成”。

想知道新的arch-lifecycle LifecycleRegistryOwner是否可以为活动提供一些钩子真的被破坏了。

以下是活动的片段:

override fun onStart() {
    super.onStart()
    if (!isBound) {
        val bindIntent = Intent(this, MusicPlayService::class.java)
        isBound = bindService(bindIntent, myConnection,
                Context.BIND_AUTO_CREATE)
    }
}

override fun onStop() {
    super.onStop()
    unbindService(myConnection)
    isBound = false
}


override fun onDestroy() {
    super.onDestroy()
    if (isFinishing) {
        val intentStopService = Intent(this, MusicPlayService::class.java)
        stopService(intentStopService)
    }
}

2 个答案:

答案 0 :(得分:3)

回答你最终的问题(转述):

  

为什么onDestroy中的整理是否会错误?

以下是the source code的相关摘要:

* The final call you receive before your
* activity is destroyed.  This can happen either because the
* activity is finishing (someone called {@link Activity#finish} on
* it, or because the system is temporarily destroying this
* instance of the activity to save space.  You can distinguish
* between these two scenarios with the {@link
* Activity#isFinishing} method.

因此isFinishing标志是区分Activity销毁的两个不同原因的帮手。

答案 1 :(得分:0)

条件

if (isFinishing) {
    val intentStopService = Intent(this, 
MusicPlayService::class.java)
    stopService(intentStopService)
 }
你在onDestroy()中检查的

总是在onDestroy中返回false。 isFinishing通常在onPause()中使用并在那里返回true。在活动完成后调用onDestroy并且isFinished返回false。因此,实现的服务销毁代码不会被执行。