我有一个用于播放音频的服务。它是使用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
,但这也没有帮助。
答案 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
标记添加到正在播放的意图中。