对bindService的标志使用0或BIND_AUTO_CREATE

时间:2013-02-07 07:54:35

标签: android

参考bindService (Intent service, ServiceConnection conn, int flags)

我可以知道,我们何时应该为flags使用0,我们应该何时应该BIND_AUTO_CREATE用于flags?该文档没有解释标志0的含义是什么。

使用0作为flags

的示例
// Start auto complete service.
autoCompleteServiceIntent = new Intent(AutoCompleteService.class.getName()); 
startService(autoCompleteServiceIntent);
bindService(autoCompleteServiceIntent, serviceConnection, 0);

BIND_AUTO_CREATE用作flags

的示例
mContext.bindService(new Intent("com.android.vending.billing.InAppBillingService.BIND"),
                             mServiceConn, Context.BIND_AUTO_CREATE);

3 个答案:

答案 0 :(得分:11)

对于方法bindService(Intent, ServiceConnection, flag),如果使用flag= Context.BIND_AUTO_CREATE,它将绑定service并启动服务,  但是如果使用"0",则方法将返回true,并且在调用startService(Intent)之类的调用以启动service之前不会启动服务。  "0"的一个常见用途是,如果该服务正在运行,则连接到本地服务的活动,否则您可以启动该服务。

答案 1 :(得分:9)

从语义上讲,如果您绑定的服务的生命周期仅在客户端绑定到服务器时有效,则使用BIND_AUTO_CREATE。那是因为所有客户都没有从中退出,它就会崩溃。

不要使用BIND_AUTO_CREATE - 或者我应该改写一下:如果您真的只是临时绑定到服务以便查询,那么使用BIND_AUTO_CREATE毫无意义或控制它,这项服务在您完成后仍然存在是合理的。对于这些情况,绑定是用于建立连接,以及服务'应使用startService()stopService()(或某些情况下为stopSelf())管理生命周期。

Google在bound services的文档中清楚地描述了后一种情况的一个常见例子:

  

" ...例如,音乐播放器可能会发现允许其服务无限期运行并提供绑定很有用。这样,活动可以启动服务以播放一些音乐,并且即使用户离开应用程序,音乐也继续播放。然后,当用户返回应用程序时,活动可以绑定到服务以重新获得对回放的控制。"

总的来说,我会说使用该标志确实区分了两种非常不同类型的用例,而不是同一事物的微调版本。

答案 2 :(得分:0)

Sourab Sharma的回答不正确,因为:

1.正如萨克斯曼评论的那样,def public_key(self): pkey = self._backend._lib.X509_REQ_get_pubkey(self._x509_req) self._backend.openssl_assert(pkey != self._backend._ffi.NULL) pkey = self._backend._ffi.gc(pkey, self._backend._lib.EVP_PKEY_free) return self._backend._evp_pkey_to_public_key(pkey) @property def subject(self): subject = self._backend._lib.X509_REQ_get_subject_name(self._x509_req) self._backend.openssl_assert(subject != self._backend._ffi.NULL) return _decode_x509_name(self._backend, subject) 只会在服务尚未开始的情况下创建服务。您应该调用startService()来启动服务。

2.如果服务成功绑定到组件,BIND_AUTO_CREATE将返回true,否则返回false。