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

标签 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()带有空 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/

相关文章:

android - 如何在不创建新应用程序的情况下从生产中取消发布应用程序并在 Google Play 中重新发布测试版?

android - 平板电脑的默认安卓应用程序

Android:从后台服务中获取网页的 'screenshot'?

java - Android服务定期在后台执行任务?

java - 谷歌应用引擎大表

java - UrlClassLoader 范围

java - 在java中创建无限数组

java - hibernate 二级 ehcache 未命中

android - Android 中的日期选择器中设置日期的问题

android - ActionBar 应该在 Fragments 上还是在 Activity 上处理?