我正在运行一个android服务,通过调用startService(Intent i)启动,它处理闹钟应用程序的声音播放部分。我遇到一个问题,如果在播放警报声音期间将应用程序从最近的应用程序抽屉中滑出,服务将停止。 (如果在警报响起之前从最近的刷过应用程序,警报会正常工作)
以下是我的服务代码:
public class RingerService extends Service {
private MediaPlayer mp;
public static final String ACTION_START = "START";
public static final String ACTION_STOP = "STOP";
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// No intent, tell the system not to restart us.
if (intent == null) {
stopSelf();
return START_NOT_STICKY;
}
if(intent.getAction().equals(ACTION_STOP))
stopSelf();
else {
final AlarmModel alarm = intent.getParcelableExtra(AlarmsActivity.EXTRA_MODEL);
Uri alarmTone = alarm.getAlarmTone();
play(alarmTone);
}
return START_STICKY;
}
private void play(Uri alarmTone) {
//TODO: test dealing with stopping previous alarm if it is sounding
mp = new MediaPlayer();
mp.setOnErrorListener(new OnErrorListener() {
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
System.out.println("Audio Playbeck Error");
mp.stop();
mp.release();
mp = null;
return true;
}
});
//TODO: lock volume at max!
try {
mp.setDataSource(this, alarmTone);
mp.setAudioStreamType(AudioManager.STREAM_ALARM);
mp.setLooping(true);
mp.prepare();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
mp.start();
}
private void stop() {
if(mp != null) {
mp.stop();
mp.release();
mp = null;
}
}
@Override
public void onDestroy() {
stop();
}
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
}
我研究过几种可能性,但事实证明这些都是死路一条。首先,我似乎没有以任何方式绑定到活动,因此我不知道为什么该服务会与应用程序的其余部分一起被杀死。
我原以为这可能与KitKat中的service-kill错误有关,但是当我在cyanogenmod 10.2设备上运行相同的代码时,同样的事情发生了。
如果我找不到解决方法,我可能会将该应用从最近的应用中排除,作为解决方法。
非常感谢任何帮助!
答案 0 :(得分:0)
可以尝试实施前台服务。 foreground service
在您的服务中实施此代码段
Notification notification = new Notification(R.drawable.icon, getText(R.string.ticker_text),
System.currentTimeMillis());
Intent notificationIntent = new Intent(this, ExampleActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
notification.setLatestEventInfo(this, getText(R.string.notification_title),
getText(R.string.notification_message), pendingIntent);
startForeground(ONGOING_NOTIFICATION_ID, notification);