Android Service的思考(2)

第二种是通过绑定的方式来启动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.  *   ver     date           author  
  8.  * ──────────────────────────────────  
  9.  *           2011-5-17      Leon  
  10.  *  
  11.  * Copyright (c) 2011, TNT All Rights Reserved.  
  12.  */  
  13.    
  14. package com.androidtest.activity.musicplayer;  
  15.    
  16. import com.androidtest.R;  
  17. import com.androidtest.service.mediaplayer.BindMusicService;  
  18. import com.androidtest.service.mediaplayer.MyBinder;  
  19. import com.androidtest.service.mediaplayer.MyMediaController;  
  20.    
  21. import android.app.Activity;  
  22. import android.content.ComponentName;  
  23. import android.content.Context;  
  24. import android.content.Intent;  
  25. import android.content.ServiceConnection;  
  26. import android.os.Bundle;  
  27. import android.os.IBinder;  
  28. import android.util.Log;  
  29. import android.view.View;  
  30. import android.view.View.OnClickListener;  
  31. import android.widget.Button;  
  32.    
  33. /**  
  34.  * ClassName:BinderMusicPlayerActivity Function: TODO ADD FUNCTION Reason: TODO  
  35.  * ADD REASON  
  36.  *  
  37.  * @author Leon  
  38.  * @version  
  39.  * @since Ver 1.1  
  40.  * @Date 2011-5-17  
  41.  */  
  42. public class BinderMusicPlayerActivity extends Activity implements  
  43.         OnClickListener {  
  44.    
  45.     private static final String TAG = BinderMusicPlayerActivity.class  
  46.             .getSimpleName();  
  47.     private BindMusicService bindMusicService;  
  48.     private Button playButton, pauseButton, stopButton, closeActivityButton,  
  49.             exitActivityButton;   
  50.    
  51.     @Override  
  52.     protected void onCreate(Bundle savedInstanceState) {  
  53.    
  54.         // TODO Auto-generated method stub  
  55.         super.onCreate(savedInstanceState);  
  56.         Log.v(TAG , TAG+"onCreate()");  
  57.         this.setContentView(R.layout.music_player_layout);  
  58.         findViews();  
  59.         bindViews();  
  60.         connection();  
  61.     }  
  62.    
  63.     private void findViews() {  
  64.         playButton = (Button) this.findViewById(R.id.play);  
  65.         pauseButton = (Button) this.findViewById(R.id.pause);  
  66.         stopButton = (Button) this.findViewById(R.id.stop);  
  67.         closeActivityButton = (Button) this.findViewById(R.id.close);  
  68.         exitActivityButton = (Button) this.findViewById(R.id.exit);  
  69.     }  
  70.    
  71.     private void bindViews() {  
  72.         playButton.setOnClickListener(this);  
  73.         pauseButton.setOnClickListener(this);  
  74.         stopButton.setOnClickListener(this);  
  75.         closeActivityButton.setOnClickListener(this);  
  76.         exitActivityButton.setOnClickListener(this);  
  77.     }  
  78.    
  79.     private void connection() {  
  80.         Log.v(TAG , TAG+"connection");  
  81.         Intent intent = new Intent("com.androidtest.service.mediaplayer.BindMusicService");  
  82.         this.startService(intent);  
  83.         this.bindService(intent, myServiceConnection, Context.BIND_AUTO_CREATE);   
  84.    
  85.     }  
  86.    
  87.     @Override  
  88.     public void onClick(View view) {  
  89.    
  90.         // TODO Auto-generated method stub  
  91.         // TODO Auto-generated method stub  
  92.         switch (view.getId()) {  
  93.         case R.id.play:  
  94.             Log.d(TAG, "play.......");  
  95.             MyMediaController.play.execute();  
  96.             break;  
  97.         case R.id.pause:  
  98.             Log.d(TAG, "pause.......");  
  99.             MyMediaController.pause.execute();  
  100.             break;  
  101.         case R.id.stop:  
  102.             Log.d(TAG, "stop.......");  
  103.             MyMediaController.stop.execute();  
  104.             break;  
  105.         case R.id.close:  
  106.             Log.d(TAG, "close.......");  
  107.             this.finish();  
  108.             break;  
  109.         case R.id.exit:  
  110.             Log.d(TAG, "exit.......");  
  111.             this.finish();  
  112.             this.stopService(new Intent("com.androidtest.service.mediaplayer.BindMusicService"));  
  113.    
  114.         }  
  115.    
  116.     }  
  117.     //调用bindService后 Service调用onBind()后 回调此函数  
  118.     private ServiceConnection myServiceConnection = new ServiceConnection() {  
  119.    
  120.         @Override  
  121.         public void onServiceConnected(ComponentName name, IBinder binder) {  
  122.             Log.v(TAG , TAG+ "onServiceConnected");  
  123.             // TODO Auto-generated method stub  
  124.             bindMusicService = ((MyBinder)binder).getService();  
  125.             //给Controller设置Service初始化的MediaPlayer  
  126.             MyMediaController.mediaPlayer=bindMusicService.getMyMediaPlayer();  
  127.    
  128.         }  
  129.    
  130.         @Override  
  131.         public void onServiceDisconnected(ComponentName name) {  
  132.    
  133.             // TODO Auto-generated method stub  
  134.             bindMusicService=null;  
  135.             Log.v(TAG, "..............onServiceDisconnected");  
  136.    
  137.         }  
  138.    
  139.     };  
  140.     //当Activity finish时必须解绑 不然会出现溢出  
  141.    
  142.     public void finish() {  
  143.         // TODO Auto-generated method stub  
  144.         super.finish();  
  145.         this.unbindService(myServiceConnection);  
  146.    
  147.     }  
  148.    
  149. }  
  150.    
  151. /**  
  152.  * BindMusicService.java  
  153.  * com.androidtest.service.mediaplayer  
  154.  *  
  155.  * Function: TODO  
  156.  *  
  157.  *   ver     date           author  
  158.  * ──────────────────────────────────  
  159.  *           2011-5-16      Leon  
  160.  *  
  161.  * Copyright (c) 2011, TNT All Rights Reserved.  
  162. */  
  163.    
  164. package com.androidtest.service.mediaplayer;  
  165.    
  166. import com.androidtest.R;  
  167.    
  168. import android.app.Service;  
  169. import android.content.Intent;  
  170. import android.media.MediaPlayer;  
  171. import android.os.IBinder;  
  172. import android.util.Log;  
  173.    
  174. /**  
  175.  * ClassName:BindMusicService  
  176.  * Function: TODO ADD FUNCTION  
  177.  * Reason:   TODO ADD REASON  
  178.  *  
  179.  * @author   Leon  
  180.  * @version  
  181.  * @since    Ver 1.1  
  182.  * @Date     2011-5-16  
  183.  */  
  184. public class BindMusicService extends Service {  
  185.    
  186.     private static final String TAG = BindMusicService.class.getSimpleName();  
  187.    
  188.     private MediaPlayer myMediaPlayer ;  
  189.    
  190.     private IBinder binder = new MyBinder(this);  
  191.    
  192.     public MediaPlayer getMyMediaPlayer() {  
  193.         return myMediaPlayer;  
  194.     }  
  195.    
  196.     public void setMyMediaPlayer(MediaPlayer myMediaPlayer) {  
  197.         this.myMediaPlayer = myMediaPlayer;  
  198.     }  
  199.    
  200.     @Override  
  201.     public IBinder onBind(Intent intent) {  
  202.         Log.v(TAG, TAG+" onBind");  
  203.         // TODO Auto-generated method stub  
  204.         return binder;  
  205.    
  206.     }  
  207.    
  208.     @Override  
  209.     public void onCreate() {  
  210.    
  211.         // TODO Auto-generated method stub  
  212.         super.onCreate();  
  213.         if(myMediaPlayer==null){  
  214.             myMediaPlayer=MediaPlayer.create(this, R.raw.test) ;  
  215.             myMediaPlayer.setLooping(false);  
  216.         }  
  217.    
  218.         Log.v(TAG , TAG +" onCreate()");  
  219.    
  220.     }  
  221.    
  222.     @Override  
  223.     public void onDestroy() {  
  224.    
  225.         // TODO Auto-generated method stub  
  226.         super.onDestroy();  
  227.         Log.v(TAG, TAG+"onDestroy()");  
  228.         if(myMediaPlayer!=null){  
  229.             myMediaPlayer.stop();  
  230.             myMediaPlayer.release();  
  231.         }  
  232.    
  233.     }  
  234.    
  235.     //通过bindService的方式,onStart函数不会调用  
  236.    
  237.     @Override  
  238.     public void onStart(Intent intent, int startId) {  
  239.    
  240.         // TODO Auto-generated method stub  
  241.         super.onStart(intent, startId);  
  242.         Log.v(TAG, TAG+" onStart()");  
  243.    
  244.     }  
  245.    
  246.     @Override  
  247.     public boolean onUnbind(Intent intent) {  
  248.    
  249.         // TODO Auto-generated method stub  
  250.         Log.v(TAG , TAG +" onUnbind ,成功没有?" + super.onUnbind(intent));  
  251.         return true;  
  252.    
  253.     }  
  254.    
  255.     @Override  
  256.     public void onRebind(Intent intent) {  
  257.    
  258.         // TODO Auto-generated method stub  
  259.         Log.v(TAG , TAG +" onRebind()----------------------------------->");  
  260.         super.onRebind(intent);  
  261.    
  262.     }  
  263.    
  264. }  
  265.    
  266. /**  
  267.  * MyBinder.java  
  268.  * com.androidtest.service.mediaplayer  
  269.  *  
  270.  * Function: TODO   
  271.  *  
  272.  *   ver     date           author  
  273.  * ──────────────────────────────────  
  274.  *           2011-5-17      Leon  
  275.  *  
  276.  * Copyright (c) 2011, TNT All Rights Reserved.  
  277.  */  
  278.    
  279. package com.androidtest.service.mediaplayer;  
  280.    
  281. import android.os.Binder;  
  282.    
  283. /**  
  284.  * ClassName:MyBinder Function: TODO ADD FUNCTION Reason: TODO ADD REASON  
  285.  *   
  286.  * @author Leon  
  287.  * @version  
  288.  * @since Ver 1.1  
  289.  * @Date 2011-5-17  
  290.  */  
  291. public class MyBinder extends Binder {  
  292.    
  293.     private BindMusicService bindMusicService;  
  294.    
  295.     public MyBinder(BindMusicService bindMusicService) {  
  296.         this.bindMusicService = bindMusicService;  
  297.     };  
  298.    
  299.     public BindMusicService getService() {  
  300.         return bindMusicService;  
  301.     }  
 

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

你可能感兴趣的:(android,移动开发,service,思考,休闲)