如何停止活动中的所有声音?

时间:2015-04-28 12:09:39

标签: android audio media-player onpause

我的应用程序活动中有很多Mediaplayer声音,我有按钮停止正在播放的所有声音,但它占用了大量空间,我想知道代码如何同时停止所有mediplayer声音不喜欢这个

    sadegfqc.pause();
    dsfsdf.pause();
    sadfsadfsad.pause();
    dsfg.pause();
    htzh.pause();
    nensmene.pause();
    fdshs.pause();
    gshtrhtr.pause();
    hfshztjr.pause();
    sgawg.pause();

然后我必须再次使用源代码调用Mediaplayer的所有创建。 像这样:

dsfsadf= MediaPlayer.create(this, R.raw.dsfsadf);

1 个答案:

答案 0 :(得分:1)

SoundPool是一个更好的替代方案。我强烈反对实例化多个MediaPlayer实例,因为大多数系统没有资源来生成许多并行活动实例。您会在许多设备上发现,按下按钮超过5次会导致基于内存的崩溃。

就停止所有活动流而言,没有用于此的烘焙功能,但它很容易以类似于现有代码的方式完成。作为旁注,有一个autoPause()方法,它停止所有流,但它并没有真正结束它们的播放(因为方法名称暗示)。以下是管理音频流的简单示例:

//SoundPool initialization somewhere
SoundPool pool = new SoundPool(10, AudioManager.STREAM_MUSIC, 0);
//Load your sound effect into the pool
int soundId = pool.load(...); //There are several versions of this, pick which fits your sound

List<Integer> streams = new ArrayList<Integer>();
Button item1 = (Button)findViewById(R.id.item1);
item1.setOnClickListener(new View.OnClickListener() {
   public void onClick(View view) {
       int streamId = pool.play(soundId, 1.0f, 1.0f, 1, 0, 1.0f);
       streams.add(streamId);
   }
});

Button stop = (Button)findViewById(R.id.stop);
stop.setOnClickListener(new View.OnClickListener() {
   public void onClick(View view) {
      for (Integer stream : streams) {
          pool.stop(stream);
      }
      streams.clear();
   }
});

管理streamID值列表的内存效率比MediaPlayer实例高得多,您的用户会感谢您。另请注意,即使streamID不再有效,也可以安全地调用SoundPool.stop(),因此您无需检查现有的播放。