看一下我必须流式传输在线广播的服务类的这段摘录:
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()
带有空 Intent ..我不知道我的 MediaPlayer 实例在重新启动后是否会处于相同的状态..例如,假设我开始流式传输一些在线广播,一段时间后该服务被终止并重新启动,我是否能够检测到空 Intent 并运行 player.prepareAsync();
(就像我正在做的那样),或者我必须使用 setDataSource();
再次让玩家知道要播放的网址?
最佳答案
如果您重新启动,这是因为系统已终止您的服务。您将获得一个新的 onCreate
和新的 onStartCommand
(您将再次经历整个生命周期)。因此您的音频实例不会相同,但这应该不是问题,因为您可以在 onCreate
中再次设置它。
如果您流式传输的位置是从服务外部设置的,则您需要在设置时存储该位置,并在重新创建时再次设置。如果位置出现在 onStartCommand
Intent 中,您可以使用 FLAG_REDELIVER_INTENT
,以便将最后一个 Intent 重新传递给您。如果您选择这条路线,请记住系统不会无限期地重新传递您的 Intent 。
请记住在 onDestroy
中进行必要的清理,当您的服务被系统终止时,可能会或可能不会调用它。
关于java - Android:服务 START_STICKY 后 MediaPlayer 会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32256298/