В чем разница баунд сервиса и стартед сервиса в Android
Что проверяют
Понимаете ли вы, кто управляет жизнью сервиса: сам сервис, вызывающий компонент или система. Следом почти всегда спрашивают, что будет, если сервис одновременно запущен и привязан, и какие ограничения на фоновую работу появились в новых версиях Android.
Как отвечать
Разница в том, кто держит сервис живым и как с ним общаются:
- started: запускается через
startService()илиstartForegroundService(), работу получает вonStartCommand(). Живёт, пока сам не вызоветstopSelf()или кто-то не вызоветstopService(), даже если запустившая его Activity уже закрыта. Возвращаемое значение (START_STICKY,START_NOT_STICKY,START_REDELIVER_INTENT) говорит системе, перезапускать ли сервис после убийства процесса; - bound: клиент подключается через
bindService()и получаетIBinderизonBind()в колбэкеServiceConnection. Дальше методы сервиса вызываются напрямую: внутри процесса через свой наследникBinder, между процессами черезMessengerили AIDL. Сервис живёт, пока привязан хотя бы один клиент; - оба режима сразу: так устроен, например, плеер. Такой сервис умрёт, только когда его остановили и от него отвязались все клиенты.
Обязательно упомяните ограничения. С Android 8 приложение в фоне не может просто вызвать startService(): нужен startForegroundService() и вызов startForeground() с уведомлением в течение нескольких секунд. С Android 12 запуск foreground-сервиса из фона запрещён, за редкими исключениями, а при targetSdk 34 и выше обязателен foregroundServiceType в манифесте. Отложенную работу сейчас отдают WorkManager, а сервис оставляют для того, что пользователь явно видит: музыка, навигация, звонок.
Где спотыкаются
Считают, что сервис работает в отдельном потоке. Оба типа по умолчанию выполняются в главном потоке, тяжёлую работу нужно уносить в корутины, иначе будет ANR.
Забывают вызвать unbindService() в onStop() или onDestroy(). Activity утекает, а в логе появляется «has leaked ServiceConnection».
Предлагают started-сервис для периодической синхронизации. На современных версиях его убьют или не дадут запустить, для этого есть WorkManager.