深入淺出 Android Service(2)

第二種是通過綁定Activity的方式來啓動Service。先看流程圖。

 

綁定的方式和第一節的方式最大的不同就是在於,Activity可以和Service實現關聯,當被關聯的Activity結束後,相應的Service也會停止,同時在綁定了的Activity中我們還可以回調我們在Service中定義的方法。在這裏我們使用了this.bindService(intent, myServiceConnection, Context.BIND_AUTO_CREATE);  來啓動Service,當Service創建了同時綁定了Activity之後,會回調我們定義的ServiceConnection(),從而傳回IBinder接口,我們就能夠調用Service中的方法了。這時候Activity就和Service實現了綁定,Activity退出了Service就相應的退出了。Service的申明如下,intent filter 是對接收Service的過濾。

<service android:enabled="true" android:name=".service.mediaplayer.BindMusicService">
<intent-filter>
<action android:name="com.androidtest.service.mediaplayer.BindMusicService" />
</intent-filter>
</service>
主要代碼如下:

Acitivity

/**
 * BinderMusicPlayerActivity.java
 * com.androidtest.activity.musicplayer
 *
 * Function: TODO 
 *
 *   ver     date      		author
 * ──────────────────────────────────
 *   		 2011-5-17 		Leon
 *
 * Copyright (c) 2011, 最牛網 All Rights Reserved.
 */

package com.zuiniuwang.playeractivity;



import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

import com.zuiniuwang.MyMediaController;
import com.zuiniuwang.R;
import com.zuiniuwang.service.BindMusicService;
import com.zuiniuwang.service.MyBinder;

/**
 * ClassName:BinderMusicPlayerActivity Function: TODO ADD FUNCTION Reason: TODO
 * ADD REASON
 * 
 * @author Leon
 * @version
 * @since Ver 1.1
 * @Date 2011-5-17
 */
public class BinderMusicPlayerActivity extends Activity implements
		OnClickListener {

	private static final String TAG = BinderMusicPlayerActivity.class
			.getSimpleName();
	private BindMusicService bindMusicService;
	private Button playButton, pauseButton, stopButton, closeActivityButton,
			exitActivityButton; 

	@Override
	protected void onCreate(Bundle savedInstanceState) {

		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		Log.v(TAG , TAG+"onCreate()");
		this.setContentView(R.layout.music_player_layout);
		findViews();
		bindViews();
		connection();
	}

	private void findViews() {
		playButton = (Button) this.findViewById(R.id.play);
		pauseButton = (Button) this.findViewById(R.id.pause);
		stopButton = (Button) this.findViewById(R.id.stop);
		closeActivityButton = (Button) this.findViewById(R.id.close);
		exitActivityButton = (Button) this.findViewById(R.id.exit);
	}

	private void bindViews() {
		playButton.setOnClickListener(this);
		pauseButton.setOnClickListener(this);
		stopButton.setOnClickListener(this);
		closeActivityButton.setOnClickListener(this);
		exitActivityButton.setOnClickListener(this);
	}

	private void connection() {
		Log.v(TAG , TAG+"connection");
		Intent intent = new Intent("com.androidtest.service.mediaplayer.BindMusicService");
		this.bindService(intent, myServiceConnection, Context.BIND_AUTO_CREATE); 
		

	}
	

	public void onClick(View view) {

		// TODO Auto-generated method stub
		// TODO Auto-generated method stub
		switch (view.getId()) {
		case R.id.play:
			Log.d(TAG, "play.......");
			MyMediaController.play.execute();
			break;
		case R.id.pause:
			Log.d(TAG, "pause.......");
			MyMediaController.pause.execute();
			break;
		case R.id.stop:
			Log.d(TAG, "stop.......");
			MyMediaController.stop.execute();
			break;
		case R.id.close:
			Log.d(TAG, "close.......");
			this.finish();
			break;
		case R.id.exit: 
			Log.d(TAG, "exit.......");
			this.finish();
			this.stopService(new Intent("com.androidtest.service.mediaplayer.BindMusicService"));
	
		}
		

	}
	//調用bindService後 Service調用onBind()後 回調此函數 
	private ServiceConnection myServiceConnection = new ServiceConnection() {

	
		public void onServiceConnected(ComponentName name, IBinder binder) {
			Log.v(TAG , TAG+ "onServiceConnected");
			// TODO Auto-generated method stub
			bindMusicService = ((MyBinder)binder).getService();
			//給Controller設置Service初始化的MediaPlayer
			MyMediaController.mediaPlayer=bindMusicService.getMyMediaPlayer();
			
		}

	
		public void onServiceDisconnected(ComponentName name) {
			
			// TODO Auto-generated method stub
			bindMusicService=null;
			Log.v(TAG, "..............onServiceDisconnected");
			
		}
		

	};
    //當Activity finish時必須解綁 不然會出現溢出

	public void finish() {	
		// TODO Auto-generated method stub
		super.finish();
	    this.unbindService(myServiceConnection);
		
	}




	
	
	
}

Service:

/**
 * BindMusicService.java
 * com.androidtest.service.mediaplayer
 *
 * Function: TODO 
 *
 *   ver     date      		author
 * ──────────────────────────────────
 *   		 2011-5-16 		Leon
 *
 * Copyright (c) 2011, 最牛網 All Rights Reserved.
*/

package com.zuiniuwang.service;



import com.zuiniuwang.R;

import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;
import android.util.Log;

/**
 * ClassName:BindMusicService
 * Function: TODO ADD FUNCTION
 * Reason:	 TODO ADD REASON
 *
 * @author   Leon
 * @version  
 * @since    Ver 1.1
 * @Date	 2011-5-16
 */
public class BindMusicService extends Service {

	private static final String TAG = BindMusicService.class.getSimpleName();
    
	private MediaPlayer myMediaPlayer ;
   
	private IBinder binder = new MyBinder(this);
	
	public MediaPlayer getMyMediaPlayer() {
		return myMediaPlayer;
	}

	public void setMyMediaPlayer(MediaPlayer myMediaPlayer) {
		this.myMediaPlayer = myMediaPlayer;
	}
	
	
    @Override
	public IBinder onBind(Intent intent) {
		Log.v(TAG, TAG+" onBind");
		// TODO Auto-generated method stub
		return binder;
		
	}

	@Override
	public void onCreate() {
		
		// TODO Auto-generated method stub
		super.onCreate();
		if(myMediaPlayer==null){
			myMediaPlayer=MediaPlayer.create(this, R.raw.test) ; 
			myMediaPlayer.setLooping(false);
		}
		
		Log.v(TAG , TAG +" onCreate()");
		
	}

	@Override
	public void onDestroy() {
		
		// TODO Auto-generated method stub
		super.onDestroy();
		Log.v(TAG, TAG+"onDestroy()");
		if(myMediaPlayer!=null){
			myMediaPlayer.stop();
			myMediaPlayer.release();
		}
		
	}
	
	//通過bindService的方式,onStart函數不會調用

	@Override
	public void onStart(Intent intent, int startId) {
		
		// TODO Auto-generated method stub
		super.onStart(intent, startId);
		Log.v(TAG, TAG+" onStart()");
		
	}

	@Override
	public boolean onUnbind(Intent intent) {
		
		// TODO Auto-generated method stub
		Log.v(TAG , TAG +" onUnbind ,成功沒有?" );
		return false;
		
		
		
	}

	@Override
	public void onRebind(Intent intent) {
		
		// TODO Auto-generated method stub
		Log.v(TAG , TAG +" onRebind()----------------------------------->");
		super.onRebind(intent);
		
	}
	
	
	

}
綁定時用到的Binder類

/**
 * MyBinder.java
 * com.androidtest.service.mediaplayer
 *
 * Function: TODO 
 *
 *   ver     date      		author
 * ──────────────────────────────────
 *   		 2011-5-17 		Leon
 *
 * Copyright (c) 2011, TNT All Rights Reserved.
 */

package com.zuiniuwang.service;

import android.os.Binder;

/**
 * ClassName:MyBinder Function: TODO ADD FUNCTION Reason: TODO ADD REASON
 * 
 * @author Leon
 * @version
 * @since Ver 1.1
 * @Date 2011-5-17
 */
public class MyBinder extends Binder {

	private BindMusicService bindMusicService;

	public MyBinder(BindMusicService bindMusicService) {
		this.bindMusicService = bindMusicService;
	};

	public BindMusicService getService() {
		return bindMusicService;
	}
}

本節的源代碼可以在此下載:http://download.csdn.net/detail/internetman/3967654    自己沒有分了所以設置了需要分數才能下載,呵呵

發佈了30 篇原創文章 · 獲贊 34 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章