綁定帳號登入

Android 台灣中文網

打印 上一主題 下一主題

[資料] activity和service之間的相互通信方法

[複製連結] 查看: 1660|回覆: 1|好評: 2
跳轉到指定樓層
樓主
暗桌之光 | 收聽TA | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
發表於 2012-3-19 15:01

馬上加入Android 台灣中文網,立即免費下載應用遊戲。

您需要 登錄 才可以下載或查看,沒有帳號?註冊

x
在 android中Activity負責前台界面展示,service負責後台的需要長期執行的任務。Activity和Service之間的通信主要由 IBinder負責。在需要和Service通信的Activity中實現ServiceConnection接口,並且實現其中的 onServiceConnected和onServiceDisconnected方法。然後在這個Activity中還要通過如下代碼綁定服務:
  1. Intent intent = new Intent().setClass( this , IHRService.class );  
  2. bindService( intent , this , Context.BIND_AUTO_CREATE );
複製代碼
當調用bindService方法後就會回調Activity的onServiceConnected,在這個方法中會向Activity中傳遞一個IBinder的實例,Acitity需要保存這個實例。代碼如下:
  1.     public void onServiceConnected( ComponentName inName , IBinder serviceBinder) {  
  2.         if ( inName.getShortClassName().endsWith( "IHRService" ) ) {  
  3.         try {  
  4.             this.serviceBinder= serviceBinder;  
  5.             mService = ( (IHRService.MyBinder) serviceBinder).getService();  
  6.             //mTracker = mService.mConfiguration.mTracker;  
  7.             } catch (Exception e) {}  
  8.                   
  9.         }  
  10.     }
複製代碼
在Service中需要創建一個實現IBinder的內部類(這個內部類不一定在Service中實現,但必須在Service中創建它)。
  1. public class MyBinder extends Binder {  
  2. //此方法是為了可以在Acitity中獲得服務的實例  
  3.     public IHRService getService() {  
  4.         return IHRService.this;  
  5.     }  
  6. //這個方法主要是接收Activity發向服務的訊息,data為發送訊息時向服務傳入的對象,replay是由服務返回的對象  
  7.     public boolean onTransact( int code , Parcel data , Parcel reply , int flags ) {  
  8.         //called when client calls transact on returned Binder  
  9.         return handleTransactions( code , data , reply , flags );  
  10.     }  
  11.   
  12. }
複製代碼
然後在Service中創建這個類的實例:
  1. public IBinder onBind( Intent intent ) {  
  2.     IBinder result = null;  
  3.     if ( null == result ) result = new MyBinder() ;  
  4.     return result;  
  5. }
複製代碼
這時候如果Activity向服務發送訊息,就可以調用如下代碼向服務端發送訊息:
  1. inSend = Parcel.obtain();  
  2. serviceBinder.transact( inCode , inSend , null , IBinder.FLAG_ONEWAY );
複製代碼
這種方式是只向服務端發送訊息,沒有返回值的。如果需要從服務端返回某些值則可用如下代碼:
  1. result = Parcel.obtain();  
  2. serviceBinder.transact( inCode , inSend , result , 0 );  
  3. return result;
複製代碼
發送訊息後IBinder接口中的onTransact將會被調用。在服務中如果有結果返回(比如下載數據)則將結果寫入到result參數中。在Activity中從result中讀取服務執行的結果。

上面只是描述了如何由Acitity向Service發送訊息,如果Service向Activity發送訊息則可借助於BroadcastReceiver實現,BroadcastReceiver比較簡單。
「用Android 就來APK.TW」,快來加入粉絲吧!
Android 台灣中文網(APK.TW)

評分

參與人數 1碎鑽 +1 幫助 +1 收起 理由
冠龍江 + 1 + 1 非常讚

查看全部評分

收藏收藏1 分享分享 分享專題
用Android 就來Android 台灣中文網(https://apk.tw)
回覆

使用道具 舉報

沙發
kkhuang | 收聽TA | 只看該作者
發表於 2013-1-12 21:34
目前正會用到類似功能  謝謝~
用Android 就來Android 台灣中文網(https://apk.tw)
回覆 支持 反對

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 註冊

本版積分規則