2017-10-13 66 views
0

我綁定到一個服務在我的活動:爲什麼unregisterReceiver()永遠不會調用onServiceDisconnected?

override fun onStart() { 
    Timber.d("onStart") 
    super.onStart() 
    val intent = Intent(this, MyService::class.java) 
    bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE) 
} 

迄今工作。然後bindService()電話onServiceConnected()

/** Defines callbacks for service binding, passed to bindService() */ 
private val serviceConnection = object : ServiceConnection { 

    override fun onServiceConnected(className: ComponentName, 
            service: IBinder) { 
     // We've bound to MyService, cast the IBinder and get MyService instance 
     val binder = service as MyService.MyBinder 
     myService = binder.service 
     isBound = true 
     registerReceiver(myBroadcastReceiver, filter) 
    } 

    override fun onServiceDisconnected(arg0: ComponentName) { 
     myService!!.removeRecevier([email protected]) 
     isBound = false 
     unregisterReceiver(myBroadcastReceiver) 
    } 
} 

在我onStop()我也有unbindService(serviceConnection),但這裏的onServiceDisconnected()永遠不會觸發? 我在做什麼錯?

所以我得到:

Activity MainActivity has leaked IntentReceiver [email protected] that was originally registered here. Are you missing a call to unregisterReceiver()? 
 
android.app.IntentReceiverLeaked: Activity MainActivity has leaked IntentReceiver [email protected] that was originally registered here. Are you missing a call to unregisterReceiver()?

+0

你需要什麼'myBroadcastReceiver'?爲什麼要在綁定到您的服務後註冊? – pskink

+0

該服務與收件人無關,我需要兩者。我只是寫了它,因爲錯誤消息。 –

+0

所以註冊到'onStart'並註銷'onStop'(或'onCreate' /'onDestroy') – pskink

回答

0

你誤會時的服務連接已丟失叫的onServiceDisconnected()

目的。這通常發生在承載服務的進程崩潰或被殺死時。這不會刪除ServiceConnection本身 - 與服務的綁定將保持活動狀態,並且在下次運行服務時您將收到對onServiceConnected(ComponentName, IBinder)的呼叫。

所以這實際上只有在你斷開與實際服務的連接時才被調用。當您從服務中解除綁定時,您必須手動進行清理。更好地處理與ServiceConnection不同(其他)級別的接收器 - 例如onStart()/onStop()

相關問題