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

Xamarin Android应用内购遇android.app.ServiceConnectionLeaked报错求助

解决联想YT3-X50L设备上InAppBilling插件PurchaseAsync冻结及ServiceConnectionLeaked问题

我之前处理过不少Xamarin内购的设备兼容性问题,尤其是联想这类定制化系统的平板,确实容易出现这种和三星等标准设备不一样的异常。针对你遇到的PlayStore弹窗后应用冻结、日志报android.app.ServiceConnectionLeaked的问题,给你几个针对性的解决思路:

  • 严格管理Service连接的生命周期
    这个ServiceConnectionLeaked错误的核心原因就是应用没有正确解绑内购Service,联想设备的系统对Service绑定的生命周期校验比三星更严格。你要确保在内购流程结束后或者Activity销毁时,主动调用解绑方法:

    protected override async void OnDestroy()
    {
        base.OnDestroy();
        if (_inAppBillingInstance != null)
        {
            await _inAppBillingInstance.DisconnectAsync();
            _inAppBillingInstance = null;
        }
    }
    

    注意这里要用异步方式调用DisconnectAsync,同时在操作完成后清空实例,避免重复绑定/解绑。

  • 避免主线程阻塞PurchaseAsync调用
    有些设备的UI线程调度逻辑比较敏感,直接在主线程等待PurchaseAsync的返回结果可能导致应用假死。你可以用ConfigureAwait(false)让异步操作不捕获当前主线程上下文,之后再切回主线程处理结果:

    // 在后台线程发起购买请求
    var purchaseResult = await _inAppBillingInstance.PurchaseAsync(productId, ItemType.InAppPurchase, "your_payload")
                                                   .ConfigureAwait(false);
    // 切回主线程更新UI或处理结果
    RunOnUiThread(() => {
        if (purchaseResult.Status == PurchaseStatus.Purchased)
        {
            // 处理成功购买逻辑
        }
    });
    
  • 适配联想设备的系统定制特性
    联想YT3-X50L的系统可能对Google Play服务的交互做了修改,你可以在调用购买前先校验Play服务的可用性,同时确保插件是最新版本(James Montemagno的插件后续版本修复过不少设备兼容性问题):

    var playStoreAvailable = await _inAppBillingInstance.IsPlayStoreAvailableAsync();
    if (!playStoreAvailable)
    {
        Toast.MakeText(this, "请确保Google Play服务已安装并更新", ToastLength.Long).Show();
        return;
    }
    // 确认可用后再发起购买
    var purchaseResult = await _inAppBillingInstance.PurchaseAsync(...);
    
  • 捕获初始化及连接阶段的异常
    有时候Service连接异常会提前发生,但没被捕获到,最终导致后续购买流程冻结。你可以在初始化InAppBilling时添加异常捕获,提前排查问题:

    try
    {
        _inAppBillingInstance = await InAppBillingServiceImplementation.InitAsync(this, "your_public_key");
    }
    catch (Exception ex)
    {
        Log.Error("InAppBillingInit", $"初始化失败: {ex.Message}");
        Toast.MakeText(this, "内购服务初始化失败", ToastLength.Long).Show();
    }
    

补充:如果以上方法都没解决问题,你可以在联想设备上开启Strict Mode,查看更详细的Service泄漏轨迹,定位到具体哪个环节没有正确解绑Service。

内容的提问来源于stack exchange,提问作者Shmukko

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:56:31