Android 如何防止服务在完成工作之前被破坏

Android 如何防止服务在完成工作之前被破坏,android,Android,如何防止服务在完成工作之前被破坏?我用它来确保设备在工作完成时不会睡着。但我不确定这会不会奏效。在一个特定的地方,我创建了一个MediaPlayer来播放声音,但是在工作了几次之后,我开始得到线程死机的异常,并且查看日志,我看到服务的onDestruct函数在MediaPlayer有机会工作之前被调用 在一个特定的地方,我正在创建一个MediaPlayer来播放声音 任何形式的IntentService都不适用于该场景。IntentService一旦onHandleIntent()返回(或者在W

如何防止服务在完成工作之前被破坏?我用它来确保设备在工作完成时不会睡着。但我不确定这会不会奏效。在一个特定的地方,我创建了一个MediaPlayer来播放声音,但是在工作了几次之后,我开始得到线程死机的异常,并且查看日志,我看到服务的onDestruct函数在MediaPlayer有机会工作之前被调用

在一个特定的地方,我正在创建一个MediaPlayer来播放声音

任何形式的
IntentService
都不适用于该场景。
IntentService
一旦
onHandleIntent()
返回(或者在
WakefulIntentService
的情况下,当
doWakefulWork()
返回时),就会被销毁。不要在
IntentService
中执行任何持续时间超过
onHandleIntent()
调用的操作

相反,请使用常规的
服务
,在该服务中,您可以管理自己的
唤醒锁
,在媒体播放完成后(通过
OnCompletionListener
)释放该服务并停止该服务


(而且,对于wakeful
IntentService
是适当解决方案的场景,我建议将
JobIntentService
置于我的
WakefulIntentService
之上)

您可以使用
前台服务
,但取舍是您必须在Android
状态栏中显示
前台通知
,或者您可以使用与intentservice相同的
JobIntentService
,但它不直接运行服务,而是使用作业来运行服务。

有趣。不知怎的,我觉得WakefulIntentService就是不用自己管理WakeLock的门票。@Michael:嗯,
WakefulIntentService
管理
WakeLock
,但它的核心仍然是
IntentService
。你的问题不在于
Wakeful
部分,而是
IntentService
部分。啊,我明白我的问题了。。。我使用的是WakefulIntentService的旧版本,它扩展了服务,而不是IntentService。@Michael:我不记得写过这样的版本,所以你可能在使用其他人的类。无论如何,您希望在媒体播放完毕之前保持服务运行。在安卓8.0+上,如果媒体超过一分钟,这可能是一个问题。我肯定它是你的,它包含字符串“com.commonware.cwac.wakeful.WakefulIntentService”!我想我可能复制/粘贴了你很久以前写的一篇博文或其他东西。