Android前台服务在某些条件下被杀死

时间:2014-10-09 22:07:30

标签: android android-widget android-service android-broadcast

我有一个用于播放音频的服务。它是使用START_STICKY创建的,并在被告知播放音乐时调用startForeground(),并在被告知停止播放音乐时调用stopForeground()

即使在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 activity services命令总是生成它,因为它应该是:

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

我的应用程序执行了一些繁重的JNI MIDI-> wav处理,但即使我使用MediaPlayer播放基本MP3,仍会发生服务终止。此外,如果有所不同,我有按钮的自定义通知。我也试过强迫PARTIAL_WAKELOCK,但这也没有帮助。

2 个答案:

答案 0 :(得分: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();
    }
}

答案 1 :(得分:0)

这是一种似乎相当可靠的解决方法,当你轻扫应用程序的任务时, 关闭了最近的屏幕:

在您的应用向您的应用发送的每个广播中(也包括PendingIntents),将Intent.FLAG_RECEIVER_FOREGROUND标记添加到正在播放的意图中。