第二种是通过绑定的方式来启动Service。先看流程图,点击放大。

在这里我们使用了this.bindService(intent, myServiceConnection, Context.BIND_AUTO_CREATE); 来启动Service,当Service创建了同时绑定了之后,会回调我们定义的ServiceConnection(),从而传回IBinder接口,我们就能够调用Service中的方法了。这时候Activity就和Service实现了绑定,Activity退出了Service就相应的退出了。

<service android:enabled="true" android:name=".service.mediaplayer.BindMusicService"> <intent-filter> <action android:name="com.androidtest.service.mediaplayer.BindMusicService" /> </intent-filter> </service>

主要代码如下:

?[Copy to clipboard] Download zuiniuwang.java
        
  1. /**
  2. *BinderMusicPlayerActivity.java
  3. *com.androidtest.activity.musicplayer
  4. *
  5. *Function:TODO
  6. *
  7. *verdateauthor
  8. *──────────────────────────────────
  9. *2011-5-17Leon
  10. *
  11. *Copyright(c)2011,TNTAllRightsReserved.
  12. */
  13. packagecom.androidtest.activity.musicplayer;
  14. importcom.androidtest.R;
  15. importcom.androidtest.service.mediaplayer.BindMusicService;
  16. importcom.androidtest.service.mediaplayer.MyBinder;
  17. importcom.androidtest.service.mediaplayer.MyMediaController;
  18. importandroid.app.Activity;
  19. importandroid.content.ComponentName;
  20. importandroid.content.Context;
  21. importandroid.content.Intent;
  22. importandroid.content.ServiceConnection;
  23. importandroid.os.Bundle;
  24. importandroid.os.IBinder;
  25. importandroid.util.Log;
  26. importandroid.view.View;
  27. importandroid.view.View.OnClickListener;
  28. importandroid.widget.Button;
  29. /**
  30. *ClassName:BinderMusicPlayerActivityFunction:TODOADDFUNCTIONReason:TODO
  31. *ADDREASON
  32. *
  33. *@authorLeon
  34. *@version
  35. *@sinceVer1.1
  36. *@Date2011-5-17
  37. */
  38. publicclassBinderMusicPlayerActivityextendsActivityimplements
  39. OnClickListener{
  40. privatestaticfinalStringTAG=BinderMusicPlayerActivity.class
  41. .getSimpleName();
  42. privateBindMusicServicebindMusicService;
  43. privateButtonplayButton,pauseButton,stopButton,closeActivityButton,
  44. exitActivityButton;
  45. @Override
  46. protectedvoidonCreate(BundlesavedInstanceState){
  47. //TODOAuto-generatedmethodstub
  48. super.onCreate(savedInstanceState);
  49. Log.v(TAG,TAG+"onCreate()");
  50. this.setContentView(R.layout.music_player_layout);
  51. findViews();
  52. bindViews();
  53. connection();
  54. }
  55. privatevoidfindViews(){
  56. playButton=(Button)this.findViewById(R.id.play);
  57. pauseButton=(Button)this.findViewById(R.id.pause);
  58. stopButton=(Button)this.findViewById(R.id.stop);
  59. closeActivityButton=(Button)this.findViewById(R.id.close);
  60. exitActivityButton=(Button)this.findViewById(R.id.exit);
  61. }
  62. privatevoidbindViews(){
  63. playButton.setOnClickListener(this);
  64. pauseButton.setOnClickListener(this);
  65. stopButton.setOnClickListener(this);
  66. closeActivityButton.setOnClickListener(this);
  67. exitActivityButton.setOnClickListener(this);
  68. }
  69. privatevoidconnection(){
  70. Log.v(TAG,TAG+"connection");
  71. Intentintent=newIntent("com.androidtest.service.mediaplayer.BindMusicService");
  72. this.startService(intent);
  73. this.bindService(intent,myServiceConnection,Context.BIND_AUTO_CREATE);
  74. }
  75. @Override
  76. publicvoidonClick(Viewview){
  77. //TODOAuto-generatedmethodstub
  78. //TODOAuto-generatedmethodstub
  79. switch(view.getId()){
  80. caseR.id.play:
  81. Log.d(TAG,"play.......");
  82. MyMediaController.play.execute();
  83. break;
  84. caseR.id.pause:
  85. Log.d(TAG,"pause.......");
  86. MyMediaController.pause.execute();
  87. break;
  88. caseR.id.stop:
  89. Log.d(TAG,"stop.......");
  90. MyMediaController.stop.execute();
  91. break;
  92. caseR.id.close:
  93. Log.d(TAG,"close.......");
  94. this.finish();
  95. break;
  96. caseR.id.exit:
  97. Log.d(TAG,"exit.......");
  98. this.finish();
  99. this.stopService(newIntent("com.androidtest.service.mediaplayer.BindMusicService"));
  100. }
  101. }
  102. //调用bindService后Service调用onBind()后回调此函数
  103. privateServiceConnectionmyServiceConnection=newServiceConnection(){
  104. @Override
  105. publicvoidonServiceConnected(ComponentNamename,IBinderbinder){
  106. Log.v(TAG,TAG+"onServiceConnected");
  107. //TODOAuto-generatedmethodstub
  108. bindMusicService=((MyBinder)binder).getService();
  109. //给Controller设置Service初始化的MediaPlayer
  110. MyMediaController.mediaPlayer=bindMusicService.getMyMediaPlayer();
  111. }
  112. @Override
  113. publicvoidonServiceDisconnected(ComponentNamename){
  114. //TODOAuto-generatedmethodstub
  115. bindMusicService=null;
  116. Log.v(TAG,"..............onServiceDisconnected");
  117. }
  118. };
  119. //当Activityfinish时必须解绑不然会出现溢出
  120. publicvoidfinish(){
  121. //TODOAuto-generatedmethodstub
  122. super.finish();
  123. this.unbindService(myServiceConnection);
  124. }
  125. }
  126. /**
  127. *BindMusicService.java
  128. *com.androidtest.service.mediaplayer
  129. *
  130. *Function:TODO
  131. *
  132. *verdateauthor
  133. *──────────────────────────────────
  134. *2011-5-16Leon
  135. *
  136. *Copyright(c)2011,TNTAllRightsReserved.
  137. */
  138. packagecom.androidtest.service.mediaplayer;
  139. importcom.androidtest.R;
  140. importandroid.app.Service;
  141. importandroid.content.Intent;
  142. importandroid.media.MediaPlayer;
  143. importandroid.os.IBinder;
  144. importandroid.util.Log;
  145. /**
  146. *ClassName:BindMusicService
  147. *Function:TODOADDFUNCTION
  148. *Reason:TODOADDREASON
  149. *
  150. *@authorLeon
  151. *@version
  152. *@sinceVer1.1
  153. *@Date2011-5-16
  154. */
  155. publicclassBindMusicServiceextendsService{
  156. privatestaticfinalStringTAG=BindMusicService.class.getSimpleName();
  157. privateMediaPlayermyMediaPlayer;
  158. privateIBinderbinder=newMyBinder(this);
  159. publicMediaPlayergetMyMediaPlayer(){
  160. returnmyMediaPlayer;
  161. }
  162. publicvoidsetMyMediaPlayer(MediaPlayermyMediaPlayer){
  163. this.myMediaPlayer=myMediaPlayer;
  164. }
  165. @Override
  166. publicIBinderonBind(Intentintent){
  167. Log.v(TAG,TAG+"onBind");
  168. //TODOAuto-generatedmethodstub
  169. returnbinder;
  170. }
  171. @Override
  172. publicvoidonCreate(){
  173. //TODOAuto-generatedmethodstub
  174. super.onCreate();
  175. if(myMediaPlayer==null){
  176. myMediaPlayer=MediaPlayer.create(this,R.raw.test);
  177. myMediaPlayer.setLooping(false);
  178. }
  179. Log.v(TAG,TAG+"onCreate()");
  180. }
  181. @Override
  182. publicvoidonDestroy(){
  183. //TODOAuto-generatedmethodstub
  184. super.onDestroy();
  185. Log.v(TAG,TAG+"onDestroy()");
  186. if(myMediaPlayer!=null){
  187. myMediaPlayer.stop();
  188. myMediaPlayer.release();
  189. }
  190. }
  191. //通过bindService的方式,onStart函数不会调用
  192. @Override
  193. publicvoidonStart(Intentintent,intstartId){
  194. //TODOAuto-generatedmethodstub
  195. super.onStart(intent,startId);
  196. Log.v(TAG,TAG+"onStart()");
  197. }
  198. @Override
  199. publicbooleanonUnbind(Intentintent){
  200. //TODOAuto-generatedmethodstub
  201. Log.v(TAG,TAG+"onUnbind,成功没有?"+super.onUnbind(intent));
  202. returntrue;
  203. }
  204. @Override
  205. publicvoidonRebind(Intentintent){
  206. //TODOAuto-generatedmethodstub
  207. Log.v(TAG,TAG+"onRebind()----------------------------------->");
  208. super.onRebind(intent);
  209. }
  210. }
  211. /**
  212. *MyBinder.java
  213. *com.androidtest.service.mediaplayer
  214. *
  215. *Function:TODO
  216. *
  217. *verdateauthor
  218. *──────────────────────────────────
  219. *2011-5-17Leon
  220. *
  221. *Copyright(c)2011,TNTAllRightsReserved.
  222. */
  223. packagecom.androidtest.service.mediaplayer;
  224. importandroid.os.Binder;
  225. /**
  226. *ClassName:MyBinderFunction:TODOADDFUNCTIONReason:TODOADDREASON
  227. *
  228. *@authorLeon
  229. *@version
  230. *@sinceVer1.1
  231. *@Date2011-5-17
  232. */
  233. publicclassMyBinderextendsBinder{
  234. privateBindMusicServicebindMusicService;
  235. publicMyBinder(BindMusicServicebindMusicService){
  236. this.bindMusicService=bindMusicService;
  237. };
  238. publicBindMusicServicegetService(){
  239. returnbindMusicService;
  240. }

本文出自 “最牛傻蛋的博客” 博客,转载请与作者联系!

更多相关文章

  1. uni-app提交表单到后端,接收表单数据
  2. android PhoneGap源码详解
  3. Android中显示动画的GIF-Movie类解决方案
  4. Android(安卓)Adapter 源码笔记(3)
  5. API Demos 2.2 研读笔记(12)——Intents Chooser
  6. 使用响应式编程(RxJava)开发Android(安卓)App
  7. Android(安卓)4.2 Ethernet启动流程
  8. [Android]ActivityUnitTestCase解释
  9. android wifiservice enable流程

随机推荐

  1. 将Android Activity设置成对话框样式
  2. Android巴士
  3. 如何解决App无法收到android开机广播
  4. 在Android中根据联系人查询电话号码
  5. windows下载android源代码
  6. Android中显示照片的Exif信息
  7. 高仿Android 点心桌面皮肤实现方式
  8. 【Android车载系统 News | Tech 3】News
  9. 博客园app for xamarin android一款简洁
  10. Android中的sqlite简单示例