2014-10-09 167 views
2

我有一个用于播放音频的服务。它是用START_STICKY创建的,当它被告知播放音乐时调用startForeground(),当它被告知停止播放音乐时调用stopForeground()Android的前台服务在某些条件下被杀死

即使将应用程序从4.2.1的任务管理器中删除后,该服务仍能正常运行并播放音乐。然而,如果应用程序被刷出并且应用程序的主屏幕/锁屏部件与之互动,或者如果我尝试在服务中尝试登录sendBroadcast(),则该服务将被无法解决。

我找不到任何会导致崩溃,没有内存不足警告,该服务不绑定到任何东西,只是:

10-09 17:14:42.186: I/ActivityManager(2591): Killing 18400:com.xperia64.timidityae/u0a10079: remove task 
10-09 17:14:42.236: W/ActivityManager(2591): Scheduling restart of crashed service com.xperia64.timidityae/.MusicService in 5000ms 

的dumpsys活动服务命令总是产生这一点,因为它应该是:

ProC# 8: adj=prcp /FS trm= 0 22326:com.xperia64.timidityae/u0a10079 (fg-service) 

我的应用程序做一些繁重的JNI MIDI-> WAV处理,但即使我玩一个基本的MP3用MediaPlayer,服务杀害仍然存在。另外,如果这有所作为,我会通过按钮进行自定义通知。我也尝试强制PARTIAL_WAKELOCK,但这也没有帮助。

+0

FWIW,我似乎记得遇到一些与您的症状相符的http://b.android.com问题的评论。唉,我不记得细节。 – CommonsWare 2014-10-09 22:57:50

回答

3

发现此变通办法在这里:https://code.google.com/p/android/issues/detail?id=53313#c1

在前台服务:

@Override 
public void onTaskRemoved(Intent rootIntent) { 
    Intent intent = new Intent(this, DummyActivity.class); 
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    startActivity(intent); 
} 

在清单:

<activity 
    android:name=".DummyActivity" 
    android:theme="@android:style/Theme.NoDisplay" 
    android:enabled="true" 
    android:allowTaskReparenting="true" 
    android:noHistory="true" 
    android:excludeFromRecents="true" 
    android:alwaysRetainTaskState="false" 
    android:stateNotNeeded="true" 
    android:clearTaskOnLaunch="true" 
    android:finishOnTaskLaunch="true" 
    /> 

在DummyActivity.java:

public class DummyActivity extends Activity { 
    @Override 
    public void onCreate(Bundle icicle) { 
     super.onCreate(icicle); 
     finish(); 
    } 
} 
+0

请注意,这会在您的应用程序的任务被刷掉后隐藏最近的屏幕。 – Sam 2015-06-24 11:39:38

+0

验证这是否适用于我。谢谢! – MahlerFive 2015-09-28 20:47:39

0

下面是一个似乎很可靠,关闭最近通话屏幕时,您的刷卡应用程序的任务远解决方法:

在每播出由您的应用程序发送到您的应用程序(也包括PendingIntents),该Intent.FLAG_RECEIVER_FOREGROUND标志添加到正在播放的意图。