【问题标题】:How to catch bindService failure如何捕获 bindService 失败
【发布时间】:2018-07-03 06:55:41
【问题描述】:

我有一些可以运行或停止的前景 IntentService。如果它是可见的,我需要在 Activity 上反映它的进度(当前状态非常复杂)。

我没有找到可靠且好的方法来确定我的 IntentService 是否正在运行并准备好绑定到我的 Activity。

如果我执行 bindService,它总是返回 true。如果 IntentService 未运行,则永远不会调用 onServiceConnected(以及任何其他回调),并且我的活动将永远保持在准备状态。

我找到的唯一可行的解​​决方案是我的 IntentService 类中的静态变量,它指示服务正在运行。但我认为使用这种方法是不好的做法,许多人警告说,在某些情况下它无法工作或不可预测。

问题: Android 开发者希望如何处理 bindService 调用失败?

以及特殊情况:如果我们尝试绑定到现在未运行或处于某种中间状态(例如关闭等)的服务,该怎么办。

【问题讨论】:

    标签: android service bindservice


    【解决方案1】:
        private UploadService.Binder mServiceBinder;
    
        @Override
            public void onCreate(@Nullable Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                createService();
            }
    
        private void createService() {
                if (mServiceBinder == null)
                    bindService(new Intent(this, UploadService.class),
                            mConnection,
                            Context.BIND_AUTO_CREATE);
            }
    
    private ServiceConnection mConnection = new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
                mServiceBinder = ((UploadService.Binder) service);
                ((UploadService.Binder) service).getService().setCallback(DashFragment.getInstance());
            }
    
            @Override
            public void onServiceDisconnected(ComponentName name) {
                mServiceBinder = null;
            }
        };
            @Override
            public void onDestroy() {
                super.onDestroy();
                if (mServiceBinder != null) {
                    unbindService(mConnection);
                    mServiceBinder = null;
                }
            }
    

    如果 mServiceBinder 不为 null 表示您的服务已成功绑定到活动,否则您必须调用创建服务方法。

    【讨论】:

    • 错误的解决方案。首先,这意味着该服务始终运行。就我而言,它可以随时停止、运行和停止。使用 BIND_AUTO_CREATE 并非如此。并且没有回答重要问题如果 bindService 由于某种原因失败并且永远不会调用 onServiceConnected 会发生什么。这对我来说很重要,因为我会在服务成功绑定并且状态更新可用之前显示一些准备 UI。
    • 可能这不是一个好的解决方案,但是一旦活动被销毁,服务就会自动销毁,因为服务与活动绑定,并且当你不提供服务或服务连接时你的第二个问题永远不会调用监听器而不是仅调用 onServiceConnected。
    • 1) 如果不需要,我宁愿不创建服务。创建它只是为了绑定活动看起来不太好(例如浪费设备资源)。 2)为什么你确定 onServiceConnected 总是被调用?如果由于某种原因(例如内存不足等)无法创建服务怎么办?您是否知道一些规范或文档合同可以确保如果带有 BIND_AUTO_CREATE 的 bindService 返回 true,那么将以任何方式调用 onServiceConnected? ty
    • 此外,如果您的 IntentService 用作前台服务,则 BIND_AUTO_CREATE 方法还有另一个缺点。 onHandleIntent 结束后通知不会消失。根据文档,当您至少有一项绑定活动时,它将被视为未完成。
    猜你喜欢
    • 2014-04-22
    • 1970-01-01
    • 2013-03-24
    • 1970-01-01
    • 1970-01-01
    • 2014-01-24
    • 2016-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多