从我必须流式传输在线无线电的服务类看一下这个例外:
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();
让玩家知道要流式传输的网址?
答案 0 :(得分:3)
如果您重新启动它,因为系统已经终止了您的服务。您将获得一个新的onCreate
和新的onStartCommand
(您将再次浏览整个生命周期)。因此,您的音频实例将不会相同,但这应该不是问题,因为您需要在onCreate
中重新设置它。
如果从您的服务外部设置您流式传输的位置,则需要在设置时存储该位置,并在重新创建时再次设置该位置。如果该位置符合onStartCommand
意图,您可以使用FLAG_REDELIVER_INTENT
,以便将最后的意图重新传递给您。如果你走这条路线,请记住系统不会无限期地重新启动你的意图。
请记住在onDestroy
中进行必要的清理工作,当您的服务被系统杀死时,可能会或可能不会调用。