Я привязываюсь к Сервису в своей деятельности:
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(this@MainActivity) isBound = false unregisterReceiver(myBroadcastReceiver) } }
В моем onStop()
меня также есть unbindService(serviceConnection)
, но здесь onServiceDisconnected () никогда не запускается? Что я делаю не так?
Поэтому я получаю:
Activity MainActivity has leaked IntentReceiver com.example.MyBroadcastReceiver@68091a2 that was originally registered here. Are you missing a call to unregisterReceiver()? android.app.IntentReceiverLeaked: Activity MainActivity has leaked IntentReceiver com.example.MyBroadcastReceiver@68091a2 that was originally registered here. Are you missing a call to unregisterReceiver()?
Вы неправильно понимаете цель onServiceDisconnected()
Вызывается, когда соединение с Сервисом потеряно. Обычно это происходит, когда процесс, на котором выполняется служба, разбился или был убит. Это не устраняет сам ServiceConnection – эта привязка к службе будет оставаться активной, и при следующем запуске службы вы получите вызов
onServiceConnected(ComponentName, IBinder)
.
Так что это на самом деле называется только, когда вы теряете соединение с фактическим сервисом. Когда вы отключаете службу, вам необходимо выполнить очистку вручную. Лучше обрабатывать приемник на другом (другом) уровне, чем ServiceConnection
– например, onStart()
/ onStop()
.