如何捕获bindService失败

时间:2018-07-03 06:55:42

标签: android service bindservice

我有一些可以运行或停止的前摄IntentService。如果活动可见,我需要在活动中反映其进度(当前状态非常复杂)。

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

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

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

问题::Android开发人员应如何处理bindService调用失败?

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

1 个答案:

答案 0 :(得分: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,则意味着您的服务已成功绑定到活动,否则您必须调用create service方法。