2017-09-18 2 views
2

Le Activity dans son onStart() se lie au MusicPlayService et, dans son onStop(), il désolidarise le MusicPlayService. Dans son onDestroy(), il appelle le stopService, mais le onDestroy (MusicPlayService de MusicPlayService ne reçoit pas du tout.Non-signé et arrêté OnDestroy du service n'est pas appelé

****** MISE À JOUR: il est le isFinishing dans le onDestroy() est faux.

si vous appuyez sur le bouton Précédent, l'activité :: onDestroy() a isFinishing == true, et si vous appuyez sur le bouton d'accueil onDestroy() est appelée (le paramètre 'ne pas garder l'activité active' est coché) mais isFinishing == faux.

Je suppose que c'est le comportement correct, que l'activité finish() commencera à mettre isFinishing == true. Même si le bouton d'accueil déclenche le onDestroy(), l'os peut toujours penser que ce n'est pas le vrai «finir». Se demander si le nouveau cycle de vie LifecycleRegistryOwner pourrait fournir un peu de hook pour l'activité est vraiment être détruit.

Voici l'extrait de l'activité:

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

A trouvé que c'est la vérification de isFinishing causant le problème, mais pourquoi quand onDestroy l'isFinishing est toujours faux? – lannyf

Répondre

3

Pour répondre à votre question éventuelle (paraphrase):

Pourquoi serait-isFinishing jamais faux OnDestroy?

est ici l'extrait pertinent de 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. 

Ainsi, le drapeau isFinishing est une aide pour différencier les deux raisons distinctes pour la destruction Activity.

0

La condition

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

que vous vérifiez dans le OnDestroy() retourne toujours faux dans OnDestroy. isFinishing est généralement utilisé dans onPause() et renvoie vrai là. Comme onDestroy est appelé après que l'activité a déjà été terminée et isFinished renvoie false. Par conséquent, le code de destruction de service de votre implémentation n'est pas exécuté.