Android:服务START_STICKY后MediaPlayer会发生什么?

时间:2015-08-27 17:54:19

标签: java android android-service

从我必须流式传输在线无线电的服务类看一下这个例外:

public class StreamingService extends Service implements MediaPlayer.OnPreparedListener {

private static final String TAG = StreamingService.class.getSimpleName();
public static final String EXTRA_STATION_IP = "STATION_IP";
private MediaPlayer player = null;

@Override
public void onCreate() {
    super.onCreate();
    Log.d(TAG, "Service Initialization.");

    // initialize player
    player = new MediaPlayer();
    player.setAudioStreamType(AudioManager.STREAM_MUSIC);
    player.setOnPreparedListener(this);
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Log.d(TAG, "Service is Starting.");

    if(intent == null) {
        // service restarted
        player.prepareAsync();
    }

    return START_STICKY;
}

我知道返回START_STICKY会尽可能重新启动我的服务,并以空意图回忆onStartCommand()。我不知道的是,我的MediaPlayer实例在此之后是否处于相同的状态重启..例如,想象一下我开始流式传输一些在线广播,经过一段时间后服务被杀死并重新启动,我能够检测到空意图并运行player.prepareAsync();(就像我正在做的那样),或者我是否必须再次使用setDataSource();让玩家知道要流式传输的网址?

1 个答案:

答案 0 :(得分:3)

如果您重新启动它,因为系统已经终止了您的服务。您将获得一个新的onCreate和新的onStartCommand(您将再次浏览整个生命周期)。因此,您的音频实例将不会相同,但这应该不是问题,因为您需要在onCreate中重新设置它。

如果从您的服务外部设置您流式传输的位置,则需要在设置时存储该位置,并在重新创建时再次设置该位置。如果该位置符合onStartCommand意图,您可以使用FLAG_REDELIVER_INTENT,以便将最后的意图重新传递给您。如果你走这条路线,请记住系统不会无限期地重新启动你的意图。

请记住在onDestroy中进行必要的清理工作,当您的服务被系统杀死时,可能会或可能不会调用。