Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/201.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:绑定和启动服务之间的差异_Android_Service - Fatal编程技术网

Android:绑定和启动服务之间的差异

Android:绑定和启动服务之间的差异,android,service,Android,Service,我试图确定绑定服务和启动服务之间的主要概念(而不是实现)差异。以下是要点: 绑定服务允许在活动和服务之间进行扩展的双向通信,而启动的服务不需要向客户端活动返回任何结果 绑定服务将为多个客户端提供服务(只要至少有一个客户端绑定到它),而启动的服务执行单个操作,然后关闭。(我知道也可以启动绑定的服务) 还有其他主要区别吗 服务是一个在后台运行的组件,用于执行长时间运行的操作,而无需与用户交互。例如,当用户在不同的应用程序中时,服务可能会在后台播放音乐,或者它可能会通过网络获取数据,而不会阻止用户

我试图确定绑定服务和启动服务之间的主要概念(而不是实现)差异。以下是要点:

  • 绑定服务允许在活动和服务之间进行扩展的双向通信,而启动的服务不需要向客户端活动返回任何结果

  • 绑定服务将为多个客户端提供服务(只要至少有一个客户端绑定到它),而启动的服务执行单个操作,然后关闭。(我知道也可以启动绑定的服务)

    还有其他主要区别吗


  • 服务是一个在后台运行的组件,用于执行长时间运行的操作,而无需与用户交互。例如,当用户在不同的应用程序中时,服务可能会在后台播放音乐,或者它可能会通过网络获取数据,而不会阻止用户与活动的交互。服务基本上可以有两种状态:

    Started:当应用程序组件(如活动)通过调用startService()启动服务时,服务启动。一旦启动,服务可以无限期地在后台运行,即使启动它的组件已被销毁

    绑定:当应用程序组件通过调用bindService()绑定到服务时,服务被绑定。绑定服务提供了一个客户机-服务器接口,允许组件与服务交互、发送请求、获取结果,甚至通过进程间通信(IPC)跨进程进行交互


    主要区别在于,当最后一个客户端解除绑定时,绑定服务将被Android操作系统终止,但启动的服务不需要任何客户端,它可以运行。正如您已经提到的,您还可以创建一个支持多客户端通信但不受约束的服务

    当你试图阻止他们时,差异也会出现。当您对绑定的服务调用
    stopService(..)
    时,它仍然有一个客户端绑定到它,而另一方面,启动的服务将被终止,而不会发生任何事情。当您对已启动的服务调用
    unbindService
    时,什么也不会发生,而如果您的服务已绑定并且这是最后一个客户端,它将关闭。。。。所以总的来说,它们之间的唯一区别在于它们是如何开始和最终停止的


    除此之外,两者没有区别。

    请参阅下面的图片,也许会对您有所帮助:


    我已经阅读了Android文档,了解回调的工作原理。我的问题旨在找出已启动服务和已启动服务之间的概念差异。您需要了解哪种类型的差异,就像在已启动服务和已启动服务之间工作一样?我们是否必须在绑定服务上调用
    unbind
    ?绑定服务是扩展双向通信的首选吗?@Amit视情况而定。如果您希望其他应用程序能够与您的服务通信,则必须使用AIDL来完成这项工作。我也看到人们喜欢这种方式,但这会使您的服务公开,所以我更喜欢handler方式(您所指的方式),除非我希望它是公开的。启动的服务可以被Android操作系统终止,没有特定的原因。你应该引用源代码。这个源代码可能来自Pluralsight教程-服务-由Sriyank SiddharthaDo编写,我们必须显式调用
    解除绑定