如何用Service来启动背景音乐

来源:互联网 发布:c语言中怎么开多次根号 编辑:程序博客网 时间:2024/05/22 00:40

概述:

    其实一开始我也不没有认真想过当我们在我们的Android程序中添加背景音乐时,这项功能应该怎么实现。只是傻乎乎地在Activity中添加这项功能,并且并不认为自己这样写会有什么问题。


思路分析:

    可是,我们是否想过这样一个问题:如果我们添加的音乐播放器的这个Activity异常关闭或是我们人为关闭时,我们的音乐播放还是否能够继续呢?

    答案肯定是不能的。我们的Activity都关闭了,那基于这个Activity的功能又怎么可能还能继续呢?那你可能会问:那我们应该怎么去实现这个功能呢?有人可能会想到,那我就去重新new一个线程,不就好了吗?我只能说这个想法很好,不过这个是行不通的。原因可能是你现在new的这个线程是作为UI线程一个子线程,当父线程都停止工作了,子线程又怎么还会苟活!

    其实,我们不要忘了,Android的四大组件中,有一个Service。它的功能类似于Activity,只是Service是在后台工作,不出现在用户的视野中。当我们在前台上进行一个人机交互操作,让这个操作关联到Service上,这样,我们就能够解决之前我们遇到的那个问题了。

    Service中也有一个onCreate()的回调方法,当我们的Service被创建时就会回调这个方法。我们可以在Service被创建时,启动背景音乐。Service中也有一个onDestroy()的回调方法,当我们的Service被关闭之前会回调这个方法。这样,我们就可以在onDestroy()这个方法里,写关闭背景音乐的代码。下面我给出这个程序的前台和后台的关键代码。


前台程序:

public class MusicActivity extends Activity{Button open, close, getTime;// 保持所启动的Service的IBinder对象MusicService.MyBinder binder;// 定义一个ServiceConnection对象private ServiceConnection conn = new ServiceConnection(){// 当该Activity与Service连接成功时回调该方法@Overridepublic void onServiceConnected(ComponentName name, IBinder service){System.out.println("--Service Connected--");// 获取Service的onBind方法所返回的MyBinder对象binder = (MusicService.MyBinder) service;}// 当该Activity与Service断开连接时回调该方法@Overridepublic void onServiceDisconnected(ComponentName name){System.out.println("--Service Disconnected--");}};@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);// 获取程序界面中的start、stop、<span style="font-family: Arial, Helvetica, sans-serif;">getTime</span><span style="font-family: Arial, Helvetica, sans-serif;">按钮</span>open = (Button) findViewById(R.id.bind);close = (Button) findViewById(R.id.unbind);getTime = (Button) findViewById(R.id.getServiceStatus);// 创建启动Service的Intentfinal Intent intent = new Intent();// 为Intent设置Action属性intent.setAction("com.music.service.BIND_SERVICE");open.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View source){// 绑定指定SerivcebindService(intent, conn, Service.BIND_AUTO_CREATE);}});close.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View source){// 解除绑定SerivceunbindService(conn);}});getTime.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View source){// 获取、并显示Service的count值Toast.makeText(MusicActivity.this,"Serivce的count值为:" + binder.getCount(),Toast.LENGTH_SHORT).show(); //②}});}}


后台程序:

public class MusicService extends Service{private int count;private boolean close;MediaPlayer m_PlayMid = null;// 定义onBinder方法所返回的对象private MyBinder binder = new MyBinder();// 通过继承Binder来实现IBinder类public class MyBinder extends Binder //①{public int getCount(){// 获取Service的运行状态:countreturn count;}}// 必须实现的方法,绑定该Service时回调该方法@Overridepublic IBinder onBind(Intent intent){System.out.println("Service is Binded");// 返回IBinder对象return binder;}// Service被创建时回调该方法。@Overridepublic void onCreate(){super.onCreate();System.out.println("Service is Created");m_PlayMid = MediaPlayer.create(this, R.raw.just_the_way_you_are);m_PlayMid.setLooping(true);// 启动一条线程、动态地修改count状态值new Thread(){@Overridepublic void run(){while (!close){try{Thread.sleep(1000);}catch (InterruptedException e){}count++;m_PlayMid.start();}}}.start();}// Service被断开连接时回调该方法@Overridepublic boolean onUnbind(Intent intent){System.out.println("Service is Unbinded");return true;}// Service被关闭之前回调该方法。@Overridepublic void onDestroy(){super.onDestroy();this.close = true;m_PlayMid.stop();System.out.println("Service is Destroyed");}}


源代码分享:

下面是我的Demo源码地址:用Service来启动背景音乐


0 0