Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> android service 學習(下)

android service 學習(下)

編輯:Android開發實例

通常每個應用程序都在它自己的進程內運行,但有時需要在進程間傳遞對象,你可以通過應用程序UI的方式寫個運行在一個不同的進程中的service。在android平台中,一個進程通常不能訪問其他進程中的內存區域。所以,他們需要把對象拆分成操作系統能理解的簡單形式,以便偽裝成對象跨越邊界訪問。編寫這種偽裝代碼相當的枯燥乏味,好在android為我們提供了AIDL工具可以來做這件事。

 

AIDL(android接口描述語言)是一個IDL語言,它可以生成一段代碼,可以使在一個android設備上運行的兩個進程使用內部通信進程進行交互。如果你需要在一個進程中(例如:在一個Activity中)訪問另一個進程中(例如:一個Service)某個對象的方法,你就可以使用AIDL來生成這樣的代碼來偽裝傳遞各種參數。

 

要使用AIDL,Service需要以aidl文件的方式提供服務接口,AIDL工具將生成一個相應的java接口,並且在生成的服務接口中包含一個功能調用的stub服務樁類。Service的實現類需要去繼承這個stub服務樁類。Service的onBind方法會返回實現類的對象,之後你就可以使用它了,參見下例:

 
先創建一個IMyRemoteService.aidl文件

 

 

package org.allin.android.remote;
interface IMusicControlService{
        void play(); 
        void stop(); 
        void pause();
}


 
如果你正在使用eclipse的Android插件,則它會根據這個aidl文件生成一個Java接口類。生成的接口類中會有一個內部類Stub類,你要做的事就是去繼承該Stub類: 
 

/**
 * @author allin.dev
 * http://allin.cnblogs.com/
 *
 */
public class RemoteMusicService extends Service {

	private static final String TAG = "RemoteMusicService";
	private MediaPlayer mediaPlayer;

	/*
	 * (non-Javadoc)
	 * 
	 * @see android.app.Service#onBind(android.content.Intent)
	 */
	@Override
	public IBinder onBind(Intent intent) {
		return binder;
	}

	private final IMusicControlService.Stub binder = new IMusicControlService.Stub() {

		@Override
		public void stop() throws RemoteException {
			Log.d(TAG,"stop....");
			if (mediaPlayer != null) {
				mediaPlayer.stop();
				try {
					// 在調用stop後如果需要再次通過start進行播放,需要之前調用prepare函數
					mediaPlayer.prepare();
				} catch (IOException ex) {
					ex.printStackTrace();
				}
			}

		}

		@Override
		public void play() throws RemoteException {
			Log.d(TAG,"play....");
			if (mediaPlayer == null) {
				mediaPlayer = MediaPlayer.create(RemoteMusicService.this,
						R.raw.tmp);
				mediaPlayer.setLooping(false);
			}
			if (!mediaPlayer.isPlaying()) {
				mediaPlayer.start();
			}
		}

		@Override
		public void pause() throws RemoteException {
			Log.d(TAG,"pause....");
			
			if (mediaPlayer != null && mediaPlayer.isPlaying()) {
				mediaPlayer.pause();
			}			
		}

	};
	
	
	@Override
	public void onDestroy() {
		super.onDestroy();
		
		Log.d(TAG, "onDestroy");
		if(mediaPlayer != null){
			mediaPlayer.stop();
			mediaPlayer.release();
		}
	}
}

 
 
當客戶端應用連接到這個Service時,onServiceConnected方法將被調用,客戶端就可以獲得IBinder對象。參看下面的客戶端onServiceConnected方法:
 

private ServiceConnection sc = new ServiceConnection() {
		
		@Override
		public void onServiceDisconnected(ComponentName name) {
			musicService = null;
			Log.d(TAG, "in onServiceDisconnected");
		}
		
		@Override
		public void onServiceConnected(ComponentName name, IBinder service) {
			musicService = IMusicControlService.Stub.asInterface(service);
			Log.d(TAG, "in onServiceConnected");
		}
	};

 
 啟動後的界面如下
 

 
 
[源碼下載]

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