Android:服务 START_STICKY 后 MediaPlayer 会发生什么变化?
Android: What happens to MediaPlayer after Service START_STICKY?
看看这个来自服务的摘录 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
将在可能的情况下重新启动我的服务并以空意图调用 onStartCommand()
。我不知道我的 MediaPlayer 实例是否会处于相同状态重启后.. 例如,假设我开始流式传输一些在线广播,服务被终止并重启几次后,我是否能够检测到空意图和 运行 player.prepareAsync();
(就像我正在做),还是我必须再次使用 setDataSource();
让玩家知道要直播的 url?
如果您重新启动,那是因为系统终止了您的服务。你会得到一个新的onCreate
和新的onStartCommand
(你又经历了整个生命周期)。所以您的音频实例将不一样,但这应该不是问题,因为您可以在 onCreate
.
中重新设置它
如果您流式传输的位置是从您的服务外部设置的,您将需要在设置时存储该位置,并在重新创建时再次设置。如果该位置出现在 onStartCommand
意图中,您可以使用 FLAG_REDELIVER_INTENT
,以便将您的最后一个意图重新发送给您。如果你走这条路,请记住系统不会无限期地重新传递你的意图。
请记住在 onDestroy
中进行任何必要的清理,当您的服务被系统终止时,可能会调用也可能不会调用。
看看这个来自服务的摘录 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
将在可能的情况下重新启动我的服务并以空意图调用 onStartCommand()
。我不知道我的 MediaPlayer 实例是否会处于相同状态重启后.. 例如,假设我开始流式传输一些在线广播,服务被终止并重启几次后,我是否能够检测到空意图和 运行 player.prepareAsync();
(就像我正在做),还是我必须再次使用 setDataSource();
让玩家知道要直播的 url?
如果您重新启动,那是因为系统终止了您的服务。你会得到一个新的onCreate
和新的onStartCommand
(你又经历了整个生命周期)。所以您的音频实例将不一样,但这应该不是问题,因为您可以在 onCreate
.
如果您流式传输的位置是从您的服务外部设置的,您将需要在设置时存储该位置,并在重新创建时再次设置。如果该位置出现在 onStartCommand
意图中,您可以使用 FLAG_REDELIVER_INTENT
,以便将您的最后一个意图重新发送给您。如果你走这条路,请记住系统不会无限期地重新传递你的意图。
请记住在 onDestroy
中进行任何必要的清理,当您的服务被系统终止时,可能会调用也可能不会调用。