6

当然,我有一个音乐服务,它负责在后台播放音乐,还有一些其他的事情,比如通知需要进行 UI 更改的活动、存储和恢复队列、通过光标获取歌曲记录,以及每个当歌曲发生变化时,它会负责更新正在进行的通知中的位图。

问题是什么?该服务几乎在用户尝试做任何事情的时候都崩溃了……几乎所有其他事情。例如,播放歌曲,然后打开游戏会导致服务崩溃,有时像在 chrome 上浏览网页这样的轻量级操作也会导致服务崩溃。

一些细节:

1 -服务是通过startService(new Intent(this, MyMusicService.class)); 但当用户离开活动时启动的,我打电话startForeground(mId, mNotification);来显示一个提供简单控制的持续通知,并且因为startForeground()它的目的是为了应该优先考虑的服务,因为 activityManager 杀死这些服务会破坏用户体验(如果服务被终止,音乐将停止)

2 -我试图重现崩溃,并且它肯定会发生在不那么繁重的工作时,比如在 chrome 上浏览(这将重现崩溃几乎 50% 的时间),并且总是在执行诸如启动 Temple run 2 之类的事情时。仅供参考,如果根本不做任何事情 - 只是在后台播放音乐并处于空闲状态,播放根本不会停止,而且它按预期的方式工作。

3 -我用作测试设备的手机绝不是慢速或低内存设备,它是 Galaxy Nexus。

4 -我试过抓几个多头,有时它只是说:

02-24 06:53:32.586: I/ActivityManager(387): Process com.deadpixels.light.player (pid 27720) has died.

没有任何其他消息,有时相同的消息会伴随着 WINDEATH:

 02-24 06:53:32.586: W/ActivityManager(387): Scheduling restart of crashed service com.deadpixels.light.player/.service.MyMusicService in 5000ms
 02-24 06:53:32.602: W/InputDispatcher(387): channel '418d09c8    com.deadpixels.light.player/com.deadpixels.light.player.HomeActivity (server)' ~ Consumer closed input channel or an error occurred.  events=0x9
 02-24 06:53:32.602: E/InputDispatcher(387): channel '418d09c8 com.deadpixels.light.player/com.deadpixels.light.player.HomeActivity (server)' ~ Channel is unrecoverably broken and will be disposed!
 02-24 06:53:32.602: W/InputDispatcher(387): Attempted to unregister already unregistered input channel '418d09c8 com.deadpixels.light.player/com.deadpixels.light.player.HomeActivity (server)'
 02-24 06:53:32.602: I/WindowState(387): WIN DEATH: Window{418d09c8 u0 com.deadpixels.light.player/com.deadpixels.light.player.HomeActivity}

我还注意到,几乎总是在崩溃发生时,许多其他服务“死掉”。我在这里附上完整的日志。

5 -我尝试使用ACRA来获取有关崩溃的更多信息,但即使一切似乎都设置正确,但在崩溃后没有发送日志,或者什么也没发生。我知道 ACRA 检测到崩溃并启动:

02-24 06:53:37.719: D/ACRA(28293): ACRA is enabled for com.deadpixels.light.player, intializing...
02-24 06:53:37.742: D/ACRA(28293): Using default Mail Report Fields
02-24 06:53:37.742: D/ACRA(28293): Looking for error files in /data/data/com.deadpixels.light.player/files
02-24 06:53:37.742: W/ACRA(28293): com.deadpixels.light.player reports will be sent by email (if accepted by user).

但没有发送任何内容,既没有发送到我设置的 mailto,也没有发送到 Google 文档中的表单。

不知道还有什么可以尝试的,我希望能得到一些关于寻找什么的好主意。正如我所说,该服务确实做了一些事情,据我所知,这并不是资源丰富,老实说,我什至不确定这是否与崩溃的服务有关。

这是服务中发生的几个代码位的要点,以及我设置的 ACRA 代码。还值得注意的是,我试图重现该服务与其他音乐播放器的崩溃,但我根本没有遇到这个问题。

谢谢您的帮助!

4

4 回答 4

3

似乎操作系统认为您的服务在用户离开您的活动后立即处于后台,尽管它是“前台”服务。

不过,我会设计您的MyMusicService服务有点不同:

  1. onCreate准备MediaPlayer.
  2. 在您的服务onStartonStartCommand实现中,开始播放选定/适当的声音文件。如果您希望音乐继续在后台播放,即使设备处于睡眠状态,也可以获取部分唤醒锁定。返回START_STICKY
  3. 向状态栏添加通知。3 在onDestroy,清理一切。

当音乐停止时,无论是通过用户交互还是歌曲结束时,请务必删除通知并释放唤醒锁定。

一个很好的教程可以在这里找到。 http://www.youtube.com/watch?v=mcb99u8Nlgs&list=PL14AA2548E3C96B50

OP 添加评论/更新“要点”后更新:

我看到onReceiveBroadcastReceiver mReceiver在您的服务中访问数据库。这可能是问题所在。将此卸载到IntentService: 在 中onReceive,只需使用收到IntentService的相同启动一个。然后可以完成所有实际工作,而不必担心任何可能导致进程终止的缓慢数据库访问。IntentonReceiveIntentService

如果在设备处于睡眠状态时仍然需要播放音乐,请务必获取部分唤醒锁(并确保在必要时释放它!)。

于 2013-02-26T22:58:00.020 回答
2

我遇到了同样的问题,你能检查一下你的mId是否与你的通知id相同吗?还要检查它是否不同于 0,因为它会将其与活动的 id 相关联并与活动相关联。

编辑:还要检查您的代码是否使用 onHandle 而是 onStartCommand。

于 2013-03-04T12:43:32.403 回答
0

如果您提供有关您的架构的更多信息,尤其是您的 Activity 和您的服务如何交互,那肯定会有所帮助。

当然是疯狂的猜测,但对我来说,这听起来好像您的 Service 引用了您的 Activity。一旦您使用不同的应用程序,您的 Activity 很可能会被销毁。

几个问题。

  • 您的服务和您的活动是否在同一进程中运行?(这会影响 Activity 和 Service 之间的信息共享方式。)
  • 您的 Activity 类是否有服务尝试访问的任何变量?(它们属于 Application 类,如果有的话。)
于 2013-03-04T08:48:12.750 回答
0

请检查您的代码,也许您自己在某个地方破坏了您的流程,例如System.exit(0);,如果您这样做,那么就会有日志

channel '418d09c8    

com.deadpixels.light.player/com.deadpixels.light.player.HomeActivity(server)'
 ~ Consumer closed input channel or an error occurred.  events=0x902-24 06:53:32.602:
 E/InputDispatcher(387): channel '418d09c8 
 com.deadpixels.light.player/com.deadpixels.light.player.HomeActivity (server)'
  ~ Channel is unrecoverably broken and will be disposed!
于 2014-04-01T01:06:58.753 回答