服务因活动而丧生

时间:2014-05-23 11:39:30

标签: android service android-activity

我正在运行一个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设备上运行相同的代码时,同样的事情发生了。

如果我找不到解决方法,我可能会将该应用从最近的应用中排除,作为解决方法。

非常感谢任何帮助!

1 个答案:

答案 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);