3

我对 Android 绑定服务有一些疑问。指南: http: //developer.android.com/guide/components/bound-services.html ,关于bindService(),说:

The `bindService()` method returns immediately without a value

但这似乎不正确,因为这里方法的签名是

public abstract boolean bindService (Intent service, ServiceConnection conn, int flags)

其中返回的布尔值描述如下:

If you have successfully bound to the service, true is returned; false is returned if the connection is not made so you will not receive the service object.

所以问题是:为什么文档说方法returns immediately without a value?此外,在这里,绑定是通过这种方式完成的:

void doBindService() {
    bindService(new Intent(Binding.this, 
            LocalService.class), mConnection, Context.BIND_AUTO_CREATE);
    mIsBound = true;
}

而且我不明白 的含义mIsBound = true,因为 javadoc 说 bindService() 如果绑定到服务失败,也可以返回 false。所以应该是:

void doBindService() {
    mIsBound = bindService(new Intent(Binding.this, 
            LocalService.class), mConnection, Context.BIND_AUTO_CREATE);
}

我错了吗?

4

2 回答 2

6

文档不正确。当返回的布尔值为 false 时,这意味着不再尝试建立连接。当返回 true 时,这意味着系统尝试建立连接,这可能成功也可能失败。

查看这个问题的答案:“在什么情况下 bindservice 返回 false”。基本上,当它没有找到甚至尝试绑定的服务时,bindservice 会返回 false。

于 2014-09-30T18:30:39.083 回答
0

好的,我终于完成了在android中绑定服务的所有细微差别的学习,那就是ServiceBindHelper类,可以被视为“终极真理”(请原谅我的不谦虚)。

https://gist.github.com/attacco/987c55556a2275f62a16

使用示例:

class MyActivity extends Activity {
    private ServiceBindHelper<MyService> myServiceHelper;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        myServiceHelper = new ServiceBindHelper<MyService>(this) {
            @Override
            protected Intent createBindIntent() {
                return new Intent(MyActivity.this, MyService.class);
            }

            @Override
            protected MyService onServiceConnected(ComponentName name, IBinder service) {
                // assume, that MyService is just a simple local service
                return (MyService) service;
            }
        };
        myServiceHelper.bind();
    }

    protected void onDestroy() {
        super.onDestroy();
        myServiceHelper.unbind();
    }

    protected void onStart() {
        super.onStart();
        if (myServiceHelper.getService() != null) {
            myServiceHelper.getService().doSmth();
        }
    }
}
于 2016-01-04T23:06:45.887 回答