本事实验使用service实现背景音乐功能,主要使用MediaPlayer控件实现。
service 你可以理解成没有的界面的activity,它是跑在后台的程序,所谓后台是相对于可以被看得到的程序的,后台程序是不能直接交互的程序。
程序中使用Binder机制,而Binder机制在很多很多的Service就是通过Binder机制来和客户端通讯交互的。
binder主要是用来进程间通信的,但也可用在和本地service通信。
本次实验使用MediaPlayer对象
主要的方法:
- create(url);是从url中获取一个应用自带的mp3文件.
- setOnCompletionListener();是为对象添加一个监听事件,用于监听事件完成.
- setLooping();设置音乐循环播放。
创建一个android项目。
1. 在res文件下创建raw文件夹把mp3文件在此目录下
2. 创建含有一个播放一个停止的按钮的布局文件
3. 创建一个AudioService类。在清单AndroidManifest.xml中添加
<service android:name="com.example.service.AudioService"></service>
AudioService.java
public class AudioService extends Service implements
MediaPlayer.OnCompletionListener {
// 实例化MediaPlayer对象
MediaPlayer player;
private final IBinder binder = new AudioBinder();
@Override
public IBinder onBind(Intent intent) {
return binder;
}
public void onCreate() {
super.onCreate();
// 从raw文件夹中获取一个应用自带的mp3文件
player = MediaPlayer.create(this, R.raw.qq);
player.setOnCompletionListener(this);// 是为player对象添加一个监听事件,用于监听事件完成
player.setLooping(true);//
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
super.onStartCommand(intent, flags, startId);
if (!player.isPlaying()) {
new MusicPlayThread().start();
} else
player.isPlaying();
return START_STICKY;
}
/**
* 当Audio播放完的时候触发该动作
*/
public void onCompletion(MediaPlayer mp) {
stopSelf();// 结束了,则结束Service
}
public void onDestroy() {
super.onDestroy();
if (player.isPlaying()) {
player.stop();
}
player.release();
}
// 为了和Activity交互,我们需要定义一个Binder对象
public class AudioBinder extends Binder {
// 返回Service对象
public AudioService getService() {
return AudioService.this;
}
}
private class MusicPlayThread extends Thread {
public void run() {
if (!player.isPlaying()) {
player.start();
}
}
}
}
在MainActivity.java中添加
public class MainActivity extends Activity {
Button playing, stop;// 声明控件变量
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findId();
playing.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
startService(new Intent(MainActivity.this, AudioService.class));// 启动service服务转向AudioService
}
});
stop.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
stopService(new Intent(MainActivity.this, AudioService.class));// 停止service
}
});
}
void findId() {// 获取控件id
playing = (Button) findViewById(R.id.playing);
stop = (Button) findViewById(R.id.stop);
}
protected void onResume() {// 在 Activity 从 Pause 状态转换到 Active 状态时被调用。
super.onResume();
startService(new Intent(MainActivity.this, AudioService.class));
}
@Override
protected void onDestroy() {// 防止程序退出后音乐不停止问题。在destroy中停止服务
// TODO Auto-generated method stub
super.onDestroy();
stopService(new Intent(MainActivity.this, AudioService.class));// 停止service
}
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
- 启动程序即可