跨模块绑定自定义Service时onServiceConnected未触发问题求助
跨模块绑定自定义Service时onServiceConnected回调未触发问题
调用context.bindService返回true,Service的onCreate和onBind方法已成功执行且返回了Binder,但客户端代码中的onServiceConnected回调始终未被触发。
客户端代码(PrinterManagerClient)
internal class PrinterManagerClient(private val context: Context): AutoCloseable { private val timeout = 30L private var service: IPrinterManager? = null private var isBound = false private val serviceBoundLatch = CountDownLatch(1) private val connection = object : ServiceConnection { override fun onServiceConnected(className: ComponentName, service: IBinder) { logger.i("PrinterManagerService Connected") this@PrinterManagerClient.service = IPrinterManager.Stub.asInterface(service) isBound = true serviceBoundLatch.countDown() } override fun onServiceDisconnected(className: ComponentName) { logger.i("PrinterManagerService Disconnected") this@PrinterManagerClient.service = null isBound = false } } init { logger.i("Binding service") Intent().apply { component = ComponentName( "com.ingenico.ingp.printer.service", "com.ingenico.ingp.printer.service.PrinterManagerService" ) val resolveInfo = context.packageManager.resolveService(this, PackageManager.MATCH_DEFAULT_ONLY) if (resolveInfo == null) { logger.e("PrinterManagerService not found! Is it installed?") } else { logger.i("PrinterManagerService found.") val isServiceBound = context.bindService(this, connection, Context.BIND_AUTO_CREATE) if (!isServiceBound) { logger.e("Service binding failed") } } } } private fun ensureServiceBound(): Boolean { return isBound || awaitServiceBound() } private fun awaitServiceBound(): Boolean { return try { serviceBoundLatch.await(timeout, TimeUnit.SECONDS) } catch (e: InterruptedException) { Thread.currentThread().interrupt() false } } private fun <T> executeServiceOperation(operation: () -> T): T { if (!ensureServiceBound()) { //throw IllegalStateException("Service not bound and timed out") // Disabled for testing purposes } return operation() } fun getPrinter(printerName: String): IPrinter? = executeServiceOperation { service!!.getPrinter(printerName) } fun getRegisteredPrinters(): List<ParcelablePrinterInstanceInfo> = executeServiceOperation { service!!.getRegisteredPrinters() } fun getSupportedPrinters(): List<ParcelablePrinterDriverInfo> = executeServiceOperation { service!!.getSupportedPrinters() } fun getDefaultPrinterName(): String = executeServiceOperation { service!!.defaultPrinterName } fun setDefaultPrinter( printerName: String ): Boolean = executeServiceOperation { service!!.setDefaultPrinter(printerName) } override fun close() { if (isBound) { context.unbindService(connection) isBound = false } } }
服务端代码(PrinterManagerService)
class PrinterManagerService : Service() { private lateinit var manager: AndroidPrinterManager private val binder = object : IPrinterManager.Stub() { override fun getPrinter(printerName: String): IPrinter? { return manager.getPrinter(printerName)?.toAidl() } override fun getDefaultPrinterName(): String = manager.defaultPrinter override fun getRegisteredPrinters(): MutableList<ParcelablePrinterInstanceInfo> { return manager.registeredPrinters.map { it.toAidl() }.toMutableList() } override fun setDefaultPrinter(printerName: String): Boolean { return try { manager.defaultPrinter = printerName true } catch (e: IllegalArgumentException) { false } } override fun getSupportedPrinters(): MutableList<ParcelablePrinterDriverInfo> { return manager.supportedPrinters.map { it.toAidl() }.toMutableList() } } override fun onBind(intent: Intent): IBinder { logger.i("onBind") return binder } override fun onCreate() { logger.i("onCreate") super.onCreate() instance = this serviceScope = CoroutineScope(SupervisorJob() + Dispatchers.Main) manager = AndroidPrinterManager(this) } override fun onDestroy() { logger.i("onDestroy") super.onDestroy() manager.close() serviceScope.cancel() // Cancel all coroutines } }
已完成排查项
- 确认清单文件中Service配置正确
- 使用ApplicationContext进行绑定
- 尝试返回简单Binder,问题依然存在
内容的提问来源于stack exchange,提问作者Kugge
相关产品推荐
相关产品推荐

