gpt4 book ai didi

java - Android:服务 START_STICKY 后 MediaPlayer 会怎样?

转载 作者:搜寻专家 更新时间:2023-11-01 08:41:25 25 4
gpt4 key购买 nike

看一下我必须流式传输在线广播的服务类(class)中的这个摘录:

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 会在可能的情况下重新启动我的服务,并以 null Intent 调用 onStartCommand()。我不知道我的 MediaPlayer 实例是否重新启动后将处于相同状态。例如,假设我开始播放一些在线广播,并且在服务被终止并重新启动几次后,我是否能够检测到 null Intent 并运行 player.prepareAsync ();(就像我正在做的那样),还是我必须再次使用 setDataSource(); 让播放器知道要流式传输的 url?

最佳答案

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

如果您流式传输的位置是从您的服务外部设置的,您将需要在设置时存储该位置,并在重新创建时再次设置。如果该位置出现在 onStartCommand Intent 中,您可以使用 FLAG_REDELIVER_INTENT,以便将您的最后一个 Intent 重新传送给您。如果您走这条路,请记住系统不会无限期地重新传递您的 Intent 。

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

关于java - Android:服务 START_STICKY 后 MediaPlayer 会怎样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32256298/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com