Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android Mediaplayer本地音樂播放器(綁定服務)

Android Mediaplayer本地音樂播放器(綁定服務)

編輯:關於Android編程

本文章介紹MediaPlayer本地音樂播放器,而當應用程序不再位於前台且沒有正在使用它的活動時,為了確保音頻繼續播放,我們需要建立一個服務Service。

Activity與綁定服務Service之間的交互是本文章的重點(這裡需要說明一點的是,Activity不能直接訪問服務對象中的方法,所以才有了我們一下的介紹,這也是為服務的安全等方面的考慮)。

\

直接上代碼:<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+PGltZyBzcmM9"/uploadfile/Collfiles/20140524/2014052409101446.jpg" alt="\">

布局文件:activity_main:



    

    

        

MainActivity:

package com.multimediademo6audioservice;

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.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity implements OnClickListener {
	private Button startServiceButton, stopServiceButton, fastBackward,
			fastForward;
	private Intent intentService;
	private SimpleAudioService simpleAudioService;
	boolean flag = false;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		init();
	}

	/**
	 * 實例化組件
	 */
	private void init() {
		startServiceButton = (Button) findViewById(R.id.startServiceButton);
		stopServiceButton = (Button) findViewById(R.id.stopServiceButton);
		fastBackward = (Button) findViewById(R.id.fastBackward);
		fastForward = (Button) findViewById(R.id.fastForward);

		startServiceButton.setOnClickListener(this);
		stopServiceButton.setOnClickListener(this);
		fastBackward.setOnClickListener(this);
		fastForward.setOnClickListener(this);
		intentService = new Intent(this, SimpleAudioService.class);
	}

	@Override
	public void onClick(View v) {

		switch (v.getId()) {
		/***
		 * 開啟
		 */
		case R.id.startServiceButton:
			startService(intentService);
			/**
			 * 通過一條bindService命令建立了與服務的連接,且該bindService命令把這個對象(
			 * 下面的ServiceConnection接口)命名為serviceConnection。
			 */
			bindService(intentService, serviceConnection,
					Context.BIND_AUTO_CREATE);
			flag = true;
			break;
		/**
		 * 關閉
		 */
		case R.id.stopServiceButton:
			if (flag) {
				unbindService(serviceConnection);
				stopService(intentService);
				flag = false;
			}

			break;
		/**
		 * 快退
		 */
		case R.id.fastBackward:
			if (flag) {
				simpleAudioService.backwardFun();
			}

			break;
		/**
		 * 快進
		 */
		case R.id.fastForward:
			if (flag) {
				simpleAudioService.forwardFun();
			}
			break;
		default:
			break;
		}
	}

	/**
	 * serviceConnection是一個ServiceConnection類型的對象,它是一個接口,用於監聽所綁定服務的狀態
	 */
	private ServiceConnection serviceConnection = new ServiceConnection() {
		/**
		 * 點擊開啟按鈕,會調用serviceConnection對象中的onServiceConnected方法。
		 * 向該方法傳遞一個IBinder對象
		 * ,其實際是從服務本身創建和提交的。這個IBinder對象將是SimpleAudioServiceBinder類型,我們將在服務中創建它。
		 * 它將有一個方法用於返回我們的服務本身,成為getService,這樣我們就可以對該方法返回的對象直接進行操作。
		 */
		@Override
		public void onServiceConnected(ComponentName name, IBinder sasBinder) {
			simpleAudioService = ((SimpleAudioService.SimpleAudioServiceBinder) sasBinder)
					.getService();
		}

		/**
		 * 該方法用於處理與服務斷開連接時的情況。
		 */
		@Override
		public void onServiceDisconnected(ComponentName name) {
			simpleAudioService = null;
		}

	};

}

開啟的服務類:SimpleAudioService:

package com.multimediademo6audioservice;

import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;
/**
 * 開啟的服務
 *
 */
public class SimpleAudioService extends Service implements OnCompletionListener {

	private String TAG = "zhongyao";
	private MediaPlayer player;

	public class SimpleAudioServiceBinder extends Binder {
		SimpleAudioService getService() {
			return SimpleAudioService.this;
		}
	}

	private final IBinder sasBinder = new SimpleAudioServiceBinder();

	@Override
	public IBinder onBind(Intent intent) {
		return sasBinder;
	}
	/**
	 * 在MainActivity中點擊開啟後調用startService開啟服務時,
	 * 會調用如下的兩個方法:onCreate(),onStartCommand()
	 */
	@Override
	public void onCreate() {
		super.onCreate();
		Log.v(TAG, "onCreate");

		player = MediaPlayer.create(this, R.raw.good);
		player.setOnCompletionListener(this);
	}

	@Override
	public int onStartCommand(Intent intent, int flags, int startId) {
		Log.d(TAG, "onStartCommand");

		if (!player.isPlaying()) {
			player.start();
		}
		return super.onStartCommand(intent, flags, startId);

	}
	/**
	 * 調用stopService停止服務時,會調用onDestroy()方法。
	 */
	@Override
	public void onDestroy() {
		super.onDestroy();
		Log.d(TAG, "onDestroy");

		if (player.isPlaying()) {
			player.stop();
		}
		player.release();
	}
	/**
	 * 播放完以後調用
	 */
	@Override
	public void onCompletion(MediaPlayer mp) {
		stopSelf();
	}
	/**
	 * 服務中方法:快退
	 */
	public void backwardFun() {
		if (player.isPlaying()) {
			player.seekTo(player.getCurrentPosition() - 2500);
		}
	}
	/**
	 * 服務中方法:快進
	 */
	public void forwardFun() {
		if (player.isPlaying()) {
			player.seekTo(player.getCurrentPosition() + 2500);
		}
	}

}

源碼下載:

點擊下載源碼

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved