6

我想创建一个利用MediaBrowserService功能的 MusicPlayer 应用程序。在浏览 MediaBrowserServiceCompat的文档时,我意识到它是Service的子类,这意味着它运行在 Application 的主 UI 线程上。

但由于音乐播放器是一项长期运行的任务,我认为最好将其实现为IntentService,而不是作为服务。

所以我想问:

  1. 我应该在哪里实现我的 MusicPlayer 服务?

  2. 我应该在实施中实施它MediaBrowserServiceCompat吗?但是它不会对 UI 线程造成太大影响吗?

  3. 或者我应该将它实现为IntentService& 从我的 MediaBrowserServiceCompat 调用它?但这似乎有点复杂。

这是我的初始代码结构

请建议。

谢谢你

4

3 回答 3

1

您应该使用 Service 作为您的音乐播放器应用程序的命令管理器。所有的播放、暂停、下一个和其他播放控件都应该发送给服务,服务会相应地委托它。Android MediaPlayer也有异步方法和相关的监听器来通知调用者。请看一看请按照音乐播放器的谷歌示例代码https://github.com/googlesamples/android-UniversalMusicPlayer很好地解决基本的音乐播放器功能。

于 2017-10-15T20:12:40.683 回答
1

我写的音乐播放器使用我播放歌曲的后台服务。

这种方法的问题在于,在小米或华为等设备上,这些服务被终止以“节省”电池寿命。我想您能做的最好的事情就是当您的服务被终止时,您可以重新启动它并重新开始歌曲...

这就是我想出的解决方案,如果有人有更好的主意,我很想听听。

于 2017-10-15T16:18:05.977 回答
0

错误的 :

我意识到它是 Service 的一个子类,这意味着它运行在 Application 的主 UI 线程上。

Doc清楚地说:

服务是一个应用程序组件,可以在后台执行长时间运行的操作

它还说如果你需要某种长时间的任务,你应该实现为Foreground Service

Intent notificationIntent = new Intent(this, ExampleActivity.class);
PendingIntent pendingIntent =
        PendingIntent.getActivity(this, 0, notificationIntent, 0);

Notification notification =
          new Notification.Builder(this, CHANNEL_DEFAULT_IMPORTANCE)
    .setContentTitle(getText(R.string.notification_title))
    .setContentText(getText(R.string.notification_message))
    .setSmallIcon(R.drawable.icon)
    .setContentIntent(pendingIntent)
    .setTicker(getText(R.string.ticker_text))
    .build();

startForeground(ONGOING_NOTIFICATION_ID, notification);
于 2017-10-09T06:25:50.253 回答