Это связано с тем, что MediaPlayer
воссоздается при каждом запуске StackActivity
. Мне даже интересно, почему это не происходит каждый раз. Точнее, старый экземпляр MediaPlayer
никогда не останавливается и даже не выпускается. Вы должны более внимательно изучить документы MediaPlayer , чтобы понять состояния.
Но для этого конкретного случая я бы попытался определить MediaPlayer Singleton .
public class MediaPlayerSingleton implements MediaPlayer.OnPreparedListener {
private static MediaPlayerSingleton instance = null;
private MediaPlayer mediaPlayer = null;
private MediaPlayerSingleton() {
mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setOnPreparedListener(this);
}
public static MediaPlayerSingleton getInstance() {
if (instance == null) {
instance = new MediaPlayerSingleton();
}
return instance;
}
@Override
public void onPrepared(MediaPlayer mediaPlayer) {
resume();
}
/**
* This will load the given URL into the media player.
* @param url The URL string from the Firebase Uri.
*/
public void play(String url) {
try {
mediaPlayer.reset()
mediaPlayer.setDataSource(url);
mediaPlayer.prepareAsync();
} catch (IOException e) {
e.printStackTrace();
}
}
public void pause() {
mediaPlayer.pause();
}
public void resume() {
mediaPlayer.start();
}
public void stop() {
mediaPlayer.stop();
}
public void release() {
mediaPlayer.release();
}
}
Затем вы можете использовать это в своей StackActivity.
public class StackActivity extends AppCompatActivity {
// your onCreate() but leave out the MediaPlayer references
private void playSong() {
FirebaseStorage storage = FirebaseStorage.getInstance();
StorageReference storageReference = storage.getReferenceFromUrl(getIntent().getStringExtra("SongUrl"));
storageReference.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
@Override
public void onSuccess(Uri uri) {
MediaPlayerSingleton.getInstance().play(uri.toString());
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Log.i("TAg", "aFailed");
}
});
}
}
Но обязательно вызовите функцию release()
этого синглтона в вашей начальной активности onDestroy()
(например, ExtrasActivity
) вот так:
@Override
protected void onDestroy() {
super.onDestroy();
MediaPlayerSingleton.getInstance().release();
}
Это нужно сделать, чтобы освободить память.
Просто примечание к приведенному мною одиночному примеру. Это простой пример, который можно улучшить, например, с помощью дополнительных нулевых проверок для экземпляра MediaPlayer. Но это должно дать вам небольшую базу.