【问题标题】:Can anybody explain what is difference between unbound and bound service in android谁能解释android中未绑定和绑定服务之间的区别
【发布时间】:2014-08-11 09:43:44
【问题描述】:

谁能解释一下android中未绑定和绑定服务的区别并解释一下意图服务

谢谢

【问题讨论】:

    标签: android android-service


    【解决方案1】:

    Bound Service

    当应用程序组件通过以下方式绑定到服务时,服务被绑定 调用 bindService()。绑定服务提供客户端-服务器 允许组件与服务交互的接口,发送 请求,获得结果,甚至跨进程这样做 进程间通信 (IPC)。

    当最后一个客户端与服务解除绑定时,系统会销毁 service EXCEPT 如果服务是由 startService

    未绑定服务或已启动

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

    但是

    关于 Service 类的大部分困惑实际上都围绕着它不是什么:

    服务不是一个单独的进程。服务对象本身 并不暗示它在自己的进程中运行;除非另有 指定,它与它所属的应用程序在同一进程中运行 的。

    服务不是线程。它本身并不是完成工作的手段 主线程(避免 Application Not Responding 错误)。

    这就是使用 IntentService 的地方。

    IntentService 是 Service 的子类,它使用工作线程来

    处理所有启动异步请求(表示为 Intents) 需求,一次一个。客户端通过发送请求 startService(Intent) 调用;服务根据需要启动,处理 每个 Intent 依次使用一个工作线程,并在它发生时自行停止 没有工作了。

    希望对你有帮助:)

    【讨论】:

    • 每种类型的明确定义谢谢!我只是在研究服务并试图找到与此相关的问题的答案。 Intent Service 不并行处理请求,它使用一个后台线程并将请求排队。拥有自己的线程池的 Bound 服务能否成为更好的可扩展性方法?
    • 您应该改用服务,是的,使用自己的线程池会是更好的方法,并选择具有固定 cpu 数量的 newFixedThreadPool(取决于可用的 cpu)。我有这种方法实际上使用 mqtt 并且它工作得很好。
    • 感谢您的回复,以及对使用服务的建议 - 只是阅读有关 mqtt 和推送通知的信息。。一旦我了解一件事,它总是会引出许多其他主题!
    【解决方案2】:

    绑定服务绑定到绑定它的活动,并且仅在绑定活动处于活动状态时才会工作。 而即使在活动被破坏后,无限制的服务也将一直工作到完成。 下面的链接中给出了表格差异,这对面试非常有用 http://infobloggall.com/2014/04/15/bounded-service-in-android/

    【讨论】:

      【解决方案3】:

      绑定和非绑定服务不是硬币的两个面

      服务可以是绑定的或未绑定的(已启动)或两者兼而有之,这只是您为服务类的回调方法提供的实现问题。查看全部四种回调方法here

      但是为了差异化你去吧

      1。盯着服务

      Unbound Service 通过调用startService() 方法启动。
      绑定服务通过调用bindService()方法启动。
      但是在这两个调用中,系统调用内部的onStartCommand() 方法

      2。服务的生命周期

      一旦 unboundService 启动,它就会无限期地运行,直到

      BoundService 只要服务绑定到客户端就会运行。当没有活动客户端绑定服务时,系统会销毁该服务

      3。 onBind() 方法

      当您编写服务时,您必须重写 onBind()。如果
      未绑定服务然后返回 null
      BoundService 然后返回 IBinder 对象。

      虽然未绑定的服务不返回 Ibinder 对象,但这并不意味着它不能与应用程序组件交互。 有一些方法可以做到这一点,例如 BroadCastReceiverResultReceiver

      与 Service 的单向与双向通信

      当您希望与您的服务进行双向通信时,您应该将您的服务与 Activity 绑定。
      例如。使用暂停、播放选项在后台播放音乐(Activtiy 服务)。

      当您只想让服务更新您的活动(服​​务->活动)时,请使用未绑定或已启动的服务。
      例如:每秒更新 Activity 的计时器服务。

      另一个例子

      您编写了一些处理位置变化的服务。
      如果您想在移动 10 米时更新您的活动(使用无绑定服务)。
      如果您想在单击活动中的某个按钮时查看当前位置的坐标。 (使用绑定服务)。

      【讨论】:

        【解决方案4】:
        1. 组件(如活动)调用 startService() 方法时启动未绑定服务 Where As A 服务在另一个组件(例如客户端)调用 bindService() 方法时被绑定。

        2. Unbound 服务可以通过调用 stopSelf() 方法自行停止。 Where As The Bound 服务在所有客户端解除绑定服务之前无法停止。

        3. Unbound 服务无限期地在后台运行。 Where As The Bound 服务不会无限期地在后台运行。

        4. Unbound 服务被 stopService() 方法停止。 在绑定服务中,客户端可以通过调用 unbindService() 方法解除绑定服务。

        谢谢

        【讨论】:

        • +1 我实际上为一个老问题提供了一个很好的答案。现在在底部添加一个指向文档的链接,我认为这是一个非常好的答案。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-23
        • 2016-04-03
        • 2017-01-20
        • 2012-11-20
        • 2013-09-20
        • 2019-05-13
        相关资源
        最近更新 更多