android service 學習(下)

來源:互聯網
上載者:User

 

android service 學習(下)

 

通常每個應用程式都在它自己的進程內運行,但有時需要在進程間傳遞對象,你可以通過應用程式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) */@Overridepublic IBinder onBind(Intent intent) {return binder;}private final IMusicControlService.Stub binder = new IMusicControlService.Stub() {@Overridepublic void stop() throws RemoteException {Log.d(TAG,"stop....");if (mediaPlayer != null) {mediaPlayer.stop();try {// 在調用stop後如果需要再次通過start進行播放,需要之前調用prepare函數mediaPlayer.prepare();} catch (IOException ex) {ex.printStackTrace();}}}@Overridepublic 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();}}@Overridepublic void pause() throws RemoteException {Log.d(TAG,"pause....");if (mediaPlayer != null && mediaPlayer.isPlaying()) {mediaPlayer.pause();}}};@Overridepublic void onDestroy() {super.onDestroy();Log.d(TAG, "onDestroy");if(mediaPlayer != null){mediaPlayer.stop();mediaPlayer.release();}}}

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

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

 
 啟動後的介面如下
 

 
 
[源碼下載]


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.