2017-10-13 131 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()

相关问题