Android中不用service来实现音乐播放

          本文转载自csdn一篇文章,作者:wyf35429827


        最近在做一个android版的连连看小游戏,希望在游戏播放背景音乐以及音效,为此搜寻了相关资料,经过学习研究得出最终解决方案:MediaPlayer+SoundPool。
MediaPlayer 用来控制游戏背景音乐的播放。
SoundPool播放游戏音效,在初始化时加载游戏中用的所有音效文件,然后在游戏中进行播放,这样声音没有延迟,保证了游戏的性能。最初我还想让背景音乐也使用SoundPool进行播放,可是经过测试,总是不成功,而且在初始化时会很慢,不知道是不是因为SoundPool不适用较大的音乐文件?

特别要说的是,我在网上看到有些文章在讲解实现游戏背景音乐的播放时,说要使用service,本人很不赞同。可能是因为大多讲解service的教程都喜欢用音乐播放器的例子,所以很多人产生了一个误解,认为只要是播放音乐就要用到service。其实人家所说是开发一个音乐播放器,这个播放器需要在系统后台持续播放歌曲,而不管是用户停留在当前应用界面还是退出到了系统桌面,或是切换到了另一个应用的界面,总之意思是说要在系统后台进行播放,这时必须要用到service。而一个游戏的背景音乐仅仅需要在游戏运行的时候播放,而在返回到桌面或者进入其他应用使游戏的activity变为不可见时,都应该立即停止播放,根本没必要使用service。
有人可能说播放背景音乐应该在后台执行,不能影响程序的正常运行,这样说当然正确,但这仅需要开辟一个单独的线程来专门播放音乐就可以了,而经我测试,MediaPlayer和SoundPool本身都已经实现了在独立的线程中播放音乐,所以综上所述在游戏中播放背景音乐完全没必要使用service,那样完全是舍近求远,画蛇添足之举。只需直接使用MediaPlayer即可。请看我的代码:

这是一个实现游戏中播放声音的类,封装了MediaPlayer和SoundPool的使用细节,所有方法都定义为静态方法,在程序启动时先调用其init方法,然后在任何地方都可以非常方便的使用

Java code
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
package  com.llkan.setup;
 
import  java.util.HashMap;
import  java.util.Map;
import  java.util.Random;
 
import  com.llkan.R;
 
import  android.content.Context;
import  android.media.AudioManager;
import  android.media.MediaPlayer;
import  android.media.SoundPool;
 
/**
  * 声音控制类
  * @author wyf
  *
  */
public  class  SoundPlayer {
 
     private  static  MediaPlayer music;
     private  static  SoundPool soundPool;
     
     private  static  boolean  musicSt =  true //音乐开关
     private  static  boolean  soundSt =  true //音效开关
     private  static  Context context;
     
     private  static  final  int [] musicId = {R.raw.bg,R.raw.bg1,R.raw.bg2,R.raw.bg3};
     private  static  Map<Integer,Integer> soundMap;  //音效资源id与加载过后的音源id的映射关系表
     
     /**
      * 初始化方法
      * @param c
      */
     public  static  void  init(Context c)
     {
         context = c;
 
         initMusic();
         
         initSound();
     }
     
     //初始化音效播放器
     private  static  void  initSound()
     {
         soundPool =  new  SoundPool( 10 ,AudioManager.STREAM_MUSIC, 100 );
         
         soundMap =  new  HashMap<Integer,Integer>();
         soundMap.put(R.raw.itemboom, soundPool.load(context, R.raw.itemboom,  1 ));
         soundMap.put(R.raw.sel, soundPool.load(context, R.raw.sel,  1 ));
     }
     
     //初始化音乐播放器
     private  static  void  initMusic()
     {
         int  r =  new  Random().nextInt(musicId.length);
         music = MediaPlayer.create(context,musicId[r]);
         music.setLooping( true );
     }
     
     /**
      * 播放音效
      * @param resId 音效资源id
      */
     public  static  void  playSound( int  resId)
     {
         if (soundSt ==  false )
             return ;
         
         Integer soundId = soundMap.get(resId);
         if (soundId !=  null )
             soundPool.play(soundId,  1 1 1 0 1 );
     }
 
     /**
      * 暂停音乐
      */
     public  static  void  pauseMusic()
     {
         if (music.isPlaying())
             music.pause();
     }
     
     /**
      * 播放音乐
      */
     public  static  void  startMusic()
     {
         if (musicSt)
             music.start();
     }
     
     /**
      * 切换一首音乐并播放
      */
     public  static  void  changeAndPlayMusic()
     {
         if (music !=  null )
             music.release();
         initMusic();
         startMusic();
     }
     
     /**
      * 获得音乐开关状态
      * @return
      */
     public  static  boolean  isMusicSt() {
         return  musicSt;
     }
     
     /**
      * 设置音乐开关
      * @param musicSt
      */
     public  static  void  setMusicSt( boolean  musicSt) {
         SoundPlayer.musicSt = musicSt;
         if (musicSt)
             music.start();
         else
             music.stop();
     }
 
     /**
      * 获得音效开关状态
      * @return
      */
     public  static  boolean  isSoundSt() {
         return  soundSt;
     }
 
     /**
      * 设置音效开关
      * @param soundSt
      */
     public  static  void  setSoundSt( boolean  soundSt) {
         SoundPlayer.soundSt = soundSt;
     }
     
     /**
      * 发出‘邦’的声音
      */
     public  static  void  boom()
     {
         playSound(R.raw.itemboom);
     }
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值