绑定服务后台播放音频的简单示例

举报
ShaderJoy 发表于 2021/12/30 01:26:44 2021/12/30
【摘要】 1.服务 当应用程序不再位于前台且没有正在使用它的活动的时候,为了确保音频继续播放,我们需要创建一个服务。服务是安卓应用程序的一个组件,其用于在后台运行任务,而无须与用户交互。 2. 本地服务与远程服务 安卓中存在几个可用的不同服务类。本地服务(Local Service):作为特定应用程序的一部分存在,而且只能通过该应用程序访问...

1.服务

当应用程序不再位于前台且没有正在使用它的活动的时候,为了确保音频继续播放,我们需要创建一个服务。服务是安卓应用程序的一个组件,其用于在后台运行任务,而无须与用户交互。

2. 本地服务与远程服务

安卓中存在几个可用的不同服务类。本地服务(Local Service):作为特定应用程序的一部分存在,而且只能通过该应用程序访问和控制。远程服务(Remote Service):是另一种类型的服务,它们可以与其他应用程序进行通信,由其他应用程序访问和控制。在此,仅介绍使用一个本地服务提供音频播放的功能。

3.本地服务

服务类需要继承android.app.Service类。该类是抽象类,所以为了扩展它,必须实现onBind方法。


  
  1. public IBinder onBind(Intent intent)
  2. {
  3. // TODO Auto-generated method stub
  4. return msBinder;//*
  5. }

还有三个表示服务生命周期的方法,onCreate和onDestroy就不用说了,重点说说onStartCommand。每当利用一个匹配服务的意图调用startService时,就会调用onStartCommand方法,因此可能会多次调用它。onStartCommand方法将返回一个整数值,其表示如果结束该服务,那么操作系统应该如何执行操作。可以使用START_STICKY表明如果结束服务,那么将重新启动该服务。


  
  1. public int onStartCommand(Intent intent, int flags, int startId)
  2. {
  3. // TODO Auto-generated method stub
  4. Log.v(TAG,"onStartCommand");
  5. if(!mediaPlayer.isPlaying())
  6. {
  7. mediaPlayer.start();
  8. }
  9. return START_STICKY;
  10. //return super.onStartCommand(intent, flags, startId);
  11. }

插一句:从android2.0中引入了onStartCommand方法,在此之前使用的是onStart方法。onStart方法的参数是一个意图和一个表示startId的整数。它不包括int类型的flags参数,而且没有返回值。如果目标电话在2.0之前运行,那么需要使用onStart方法。

注意,别忘了在清单文件中加入一个条目指定该服务。

下一步,我们还希望能够通过活动来控制服务中的MediaPlayer,而发出命令则显得更为复杂。为了控制MediaPlayer,需要利用bindService方法把该活动与服务绑定在一起(解绑定则使用unbindService)。一旦这样做了,由于活动与服务在相同的进程中运行,因此可以直接调用服务中的方法。如果正在创建一个远程服务,那么必须采取更深入一步的步骤。


  
  1. //启动音乐服务
  2. playMusicServiceIntent=new Intent(this,MusicService.class);
  3. startService(playMusicServiceIntent);
  4. //serviceConnection是一个ServiceConnection类型的对象,它是一个接口,用于监控所绑定服务的状态
  5. serviceConnection=new ServiceConnection()
  6. {
  7. @Override
  8. public void onServiceDisconnected(ComponentName name)
  9. {
  10. // TODO Auto-generated method stub
  11. musicService=null;
  12. }
  13. //注意该方法传入了一个IBinder对象,其实际上是由服务本身创建并提交的
  14. @Override
  15. public void onServiceConnected(ComponentName name, IBinder service)
  16. {
  17. // TODO Auto-generated method stub
  18. musicService=((MusicService.MusicServiceBinder)service).getService();
  19. }
  20. };
  21. //绑定服务时,需要传入intent和serviceConnection
  22. bindService(playMusicServiceIntent, serviceConnection, Context.BIND_AUTO_CREATE);


  
  1. public class MusicServiceBinder extends Binder//*
  2. {
  3. MusicService getService()
  4. {
  5. return MusicService.this;
  6. }
  7. }

现在就搭好了基础,可以向服务中添加任何喜欢的功能,同时通过绑定服务,可以直接调用服务中定义的各种方法。如果不绑定服务的话,那么除了启动和停止服务之外,我们将不能做任何其他的事情。

完整代码示例:

活动中的代码:


  
  1. //启动音乐服务
  2. playMusicServiceIntent=new Intent(this,MusicService.class);
  3. startService(playMusicServiceIntent);
  4. serviceConnection=new ServiceConnection()
  5. {
  6. @Override
  7. public void onServiceDisconnected(ComponentName name)
  8. {
  9. // TODO Auto-generated method stub
  10. musicService=null;
  11. }
  12. @Override
  13. public void onServiceConnected(ComponentName name, IBinder service)
  14. {
  15. // TODO Auto-generated method stub
  16. musicService=((MusicService.MusicServiceBinder)service).getService();
  17. }
  18. };
  19. //绑定服务
  20. bindService(playMusicServiceIntent, serviceConnection, Context.BIND_AUTO_CREATE);
  21. //控制音乐服务的按钮
  22. Musicbtn=(Button) findViewById(R.id.musicOn);
  23. Musicbtn.setBackgroundResource(R.drawable.musicon);
  24. Musicbtn.setOnClickListener(new OnClickListener()
  25. {
  26. @Override
  27. public void onClick(View v)
  28. {
  29. // TODO Auto-generated method stub
  30. if(musicService.IsPlayNow())
  31. {
  32. Musicbtn.setBackgroundResource(R.drawable.musicoff);
  33. musicService.PauseMusic();
  34. }
  35. else
  36. {
  37. Musicbtn.setBackgroundResource(R.drawable.musicon);
  38. musicService.ResumeMusic();
  39. }
  40. }
  41. });



  
  1. public class MusicService extends Service implements OnCompletionListener
  2. {
  3. static final String TAG="PLAYERSERVICE";
  4. MediaPlayer mediaPlayer;
  5. private final IBinder msBinder=new MusicServiceBinder();//*
  6. public class MusicServiceBinder extends Binder//*
  7. {
  8. MusicService getService()
  9. {
  10. return MusicService.this;
  11. }
  12. }
  13. @Override
  14. public void onCreate()
  15. {
  16. // TODO Auto-generated method stub
  17. //super.onCreate();
  18. Log.v(TAG,"onCreate");
  19. mediaPlayer=MediaPlayer.create(this,R.raw.music);
  20. mediaPlayer.setOnCompletionListener(this);
  21. }
  22. @Override
  23. public void onDestroy()
  24. {
  25. // TODO Auto-generated method stub
  26. if(mediaPlayer.isPlaying())
  27. {
  28. mediaPlayer.stop();
  29. }
  30. mediaPlayer.release();
  31. Log.v(TAG,"onDestroy");
  32. //super.onDestroy();
  33. }
  34. @Override
  35. public int onStartCommand(Intent intent, int flags, int startId)
  36. {
  37. // TODO Auto-generated method stub
  38. Log.v(TAG,"onStartCommand");
  39. if(!mediaPlayer.isPlaying())
  40. {
  41. mediaPlayer.start();
  42. }
  43. return START_STICKY;
  44. //return super.onStartCommand(intent, flags, startId);
  45. }
  46. @Override
  47. public IBinder onBind(Intent intent)
  48. {
  49. // TODO Auto-generated method stub
  50. return msBinder;//*
  51. }
  52. @Override
  53. public void onCompletion(MediaPlayer mediaPlayer)
  54. {
  55. // TODO Auto-generated method stub
  56. //stopSelf();
  57. mediaPlayer.start();
  58. }
  59. public void PauseMusic()
  60. {
  61. if(mediaPlayer.isPlaying())
  62. {
  63. mediaPlayer.pause();
  64. }
  65. }
  66. public void ResumeMusic()
  67. {
  68. if(!mediaPlayer.isPlaying())
  69. {
  70. mediaPlayer.start();
  71. }
  72. }
  73. public boolean IsPlayNow()
  74. {
  75. return mediaPlayer.isPlaying();
  76. }
  77. }


文章来源: panda1234lee.blog.csdn.net,作者:panda1234lee,版权归原作者所有,如需转载,请联系作者。

原文链接:panda1234lee.blog.csdn.net/article/details/8763294

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。