You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

跨模块绑定自定义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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 22:07:39