【问题标题】:Android Service, do we have to use startService or BindService?Android Service,我们必须使用startService还是BindService?
【发布时间】:2015-06-25 14:02:14
【问题描述】:

我正在开发一个 MusicPlayer 应用程序,我使用本地服务使 MediaPlayer 在后台运行。似乎我们可以发送启动服务的意图或绑定服务。我理解 startService 的意义,我们让它继续运行并向 stopService 发送意图,而对于 bindService,我们返回一个 IBinder 以与服务通信。但是,我想知道这样做有什么意义?我们是否必须发送意图才能使其工作? 如果我只是获取一个Service的静态实例,直接调用它的方法,我也可以实现启动和通信。

我找到了一个不使用 startService 和 bindService 的示例,但它作为一个简单的 MusicPlayer 效果很好。

片段调用Service: https://github.com/zacharytamas/spotify-sampler/blob/master/app/src/main/java/com/zacharytamas/spotifysampler/ui/PlayerFragment.java

服务类: https://github.com/zacharytamas/spotify-sampler/blob/master/app/src/main/java/com/zacharytamas/spotifysampler/services/PlayerService.java

【问题讨论】:

    标签: android android-intent android-service android-mediaplayer


    【解决方案1】:

    但是,我想知道这样做有什么意义?

    要让服务运行,告诉操作系统“嘿,我们正在代表用户在这里工作,请让我的进程再存活一点”。

    the documentation 对此进行了介绍。

    我们是否必须发送意图才能使其工作?

    是的。

    如果我只是获取一个Service的静态实例,并直接调用它的方法,我也可以实现既启动它又与它通信。

    那么它只是一个Java对象,继承Service没有意义。此外,这意味着当您的 UI 不在前台时,您的进程将持续更少的时间。

    我找到了一个不使用 startService 或 bindService 的示例,但它作为一个简单的 MusicPlayer 运行良好。

    服务已通过startService()in ArtistSearchActivity 启动。在这完成之前,服务不存在,单例将是null

    【讨论】:

    • 谢谢,我没有注意到 startService().但是这个实现还是有很大区别的,它使用了startService(),但是还是通过注册自定义事件与服务进行通信,我能说这是IBinder的另一种形式,就像自定义的EventBus实现一样吗?
    • @dengn:“仍然通过注册自定义事件与服务通信”——我没有看到这个,抱歉。 “我可以说这是另一种形式的 IBinder”——不。它只是单例模式的一种实现。另外,请不要假设碰巧在 GitHub 上的代码一定是生产级代码。在这种情况下,开发人员启动一个服务并且从不停止它。这违反了服务规则:only have them running when they are actively delivering value to the user.
    【解决方案2】:

    startService 在不需要与服务通信时使用。 BindService 在需要与之通信时使用。

    在您的应用程序中,我认为您将与服务进行通信(例如,如果您有一个选择歌曲的活动,您将向服务发送数据以说:“这是您必须播放的歌曲现在”),我认为您将需要 BindService 而不是 startService。

    希望对你有帮助:D

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-12
      • 1970-01-01
      • 2017-11-05
      • 2015-02-12
      • 2019-03-08
      相关资源
      最近更新 更多