MediaPlayer.java
//1.采用bindService是因为保证每次进来后可以重新绑定click事件,当然如果已经startService,那么unbindservice,只会unbind,不会onDestroy掉,在进来后虽然不会bind了,但是其实还是绑定成功的,因为调用了onServiceConnected
//2.采用startService是因为保证应用退出后,再进来还是同一个service实例,有着自己生命周期
public class Mediaplayer extends Activity {
private boolean isbinded = false;
private ServiceConnection conn = new ServiceConnection(){
@Override
public void onServiceConnected(ComponentName arg0, IBinder arg1) {
System.out.println("onServiceConnected");
isbinded=true;
final MyBiner bind=(MyBiner)arg1;
findViewById(R.id.stop).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
bind.stopmusic();
}
});
findViewById(R.id.start).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
bind.playmusic();
}
});
}
//是在服务崩溃或被杀死导致的连接中断时被调用,而如果我们自己解除绑定时则不会被调用
@Override
public void onServiceDisconnected(ComponentName arg0) {
System.out.println("onServiceDisconnected");
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Intent intent = new Intent(this, PlayService.class);
startService(intent);
bindService(intent, conn, BIND_AUTO_CREATE);
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
if(isbinded==true){
unbindService(conn);
isbinded=false;
}
super.onDestroy();
}
}
public class PlayService extends Service{
private Uri resource=Uri.parse("http://qzone.haoduoge.com/music/C0BEDKZT7D75B00FE55A8D0312EB01F203BDA.mp3"); //from network
private MediaPlayer mediaplayer=null;
/**
* 停止
*/
void stopmusic1(){
if(mediaplayer!=null){
mediaplayer.stop();
mediaplayer.release();
mediaplayer=null;
}
}
/**
* 方式1
*/
private void playmusic1(){
stopmusic1();
mediaplayer=MediaPlayer.create(this,R.raw.yuanwang); //这里其实是会阻塞主线程的 ,所以要放到其他线程
mediaplayer.start(); //no need to call prepare because create does for you
}
/**
* 方式2
*/
private void playmusic2(){
stopmusic1();
mediaplayer=new MediaPlayer();
mediaplayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
try{
mediaplayer.setDataSource(this,resource); //这里其实是会阻塞主线程的 ,所以要放到其他线程
mediaplayer.prepare();
}catch(IOException e){
e.printStackTrace();
}
mediaplayer.start();
}
public class MyBiner extends Binder{
public void playmusic(){
playmusic1();
}
public void stopmusic(){
stopmusic1();
}
}
@Override
public IBinder onBind(Intent arg0) {
System.out.println("onBind");
return new MyBiner();
}
@Override
public void onCreate() {
System.out.println("onCreate");
super.onCreate();
}
@Override
public void onDestroy() {
System.out.println("onDestroy");
super.onDestroy();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
System.out.println("onStartCommand");
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onStart(Intent intent, int startId) {
System.out.println("onStart");
super.onStart(intent, startId);
}
@Override
public boolean onUnbind(Intent intent) {
System.out.println("onUnbind");
return super.onUnbind(intent);
}
}