20

通过引用bindService(Intent service, ServiceConnection conn, int flags)

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

使用 0 作为示例flags

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

使用BIND_AUTO_CREATEas 的示例flags

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

3 回答 3

15

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

于 2013-02-07T08:27:06.143 回答
12

从语义上讲,BIND_AUTO_CREATE如果您要绑定到一个服务,该服务的生命周期仅在它具有绑定到它的客户端时才有效。那是因为一旦所有客户端都解除绑定,它就会下降。

不要使用BIND_AUTO_CREATE- 或者我应该换个说法:BIND_AUTO_CREATE如果你真的只是暂时绑定到服务以查询或控制它,那么使用它是没有意义的,并且在你完成后该服务将继续存在是合理的. 对于这些情况,绑定用于建立连接,服务的生命周期应使用startService()and stopService()(或stopSelf()在某些情况下)进行管理。

谷歌在绑定服务的文档中清楚地描述了后一种情况的一个常见例子:

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

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

于 2014-08-13T15:34:18.380 回答
0

如果您调用,则使用withstartService()绑定到服务,然后调用,在这种情况下,服务将不会停止,直到所有绑定的客户端都解除绑定。bindService()BIND_AUTO_CREATEstopService()

在同样的情况下,如果你调用bindService()Service0将被停止并且它onUnbind()onDestroy()回调被调用。

于 2021-11-16T18:16:05.580 回答