Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 中級開發 >> 使用android中的AIDL讓Service與Activity通信(service回調activity)

使用android中的AIDL讓Service與Activity通信(service回調activity)

編輯:中級開發

這幾天搞了搞AIDL,終於弄明白了在AIDL中讓Service調用Activity的方法
代碼:
首先建立一個ICallback.aidl文件,作為Activity中的回調方法

  1. package com.zhang.test.service;
     

  2.  
  3. interface ICallback {
     
  4. void showResult(int result);
     
  5. }
復制代碼

然後再建立一個IService.aidl用來在Activity中接收Service回調,以及在Service中onBind時返回的Binder
注意:aidl中import不能寫com.xxx.*,要寫全類的路徑

  1. package com.zhang.test.service;
     

  2.  
  3. import com.zhang.test.service.ICallback;
     

  4.  
  5. interface IService {
     
  6.         void registerCallback(ICallback cb);
     
  7.         void unregisterCallback(ICallback cb);
     
  8. }
復制代碼

接下來是service:
MainService.Java

  1. package com.zhang.test.service;
     

  2.  
  3. import android.app.Service;
     
  4. import android.content.Intent;
     
  5. import android.os.Handler;
     
  6. import android.os.IBinder;
     
  7. import android.os.Message;
     
  8. import android.os.RemoteCallbackList;
     
  9. import android.os.RemoteException;
     
  10. import android.util.Log;
     

  11.  
  12. public class MainService extends Service {
     

  13.  
  14.     private static final String TAG = "MainService";
     

  15.  
  16.     private RemoteCallbackList<icallback> mCallbacks = new RemoteCallbackList<icallback>();
     

  17.  
  18.     private IService.Stub mBinder = new IService.Stub() {
     

  19.  
  20.         @Override
     
  21.         public void unregisterCallback(ICallback cb){
     
  22.             if(cb != null) {
     
  23.                 mCallbacks.unregister(cb);
     
  24.             }
     
  25.         }
     

  26.  
  27.         @Override
     
  28.         public void registerCallback(ICallback cb){
     
  29.             if(cb != null) {
     
  30.                 mCallbacks.register(cb);
     
  31.             }
     
  32.         }
     
  33.     };
     

  34.  
  35.     @Override
     
  36.     public IBinder onBind(Intent intent) {
     
  37.         Log.d(TAG, "onBind");
     
  38.         return mBinder;
     
  39.     }
     

  40.  
  41.     @Override
     
  42.     public void onCreate() {
     
  43.         Log.d(TAG, "onCreate");
     
  44.         //這裡不知道為什麼,直接使用callback方法回調showResult
     
  45.         //mCallbacks.beginBroadcast()是0,需要用handler延遲1000毫秒
     
  46.         //也許是在activity中binService太耗時的原因?
     
  47.         mHandler.sendEmptyMessageDelayed(0, 1000);
     
  48.         super.onCreate();
     
  49.     }
     

  50.  
  51.     @Override
     
  52.     public void onDestroy() {
     
  53.         mHandler.removeMessages(0);
     
  54.         mCallbacks.kill();
     
  55.         super.onDestroy();
     
  56.     }
     

  57.  
  58.     private void callBack() {
     
  59.         int N = mCallbacks.beginBroadcast();
     
  60.         try {
     
  61.             for (int i = 0; i < N; i++) {
     
  62.                 mCallbacks.getBroadcastItem(i).showResult(i);
     
  63.             }
     
  64.         } catch (RemoteException e) {
     
  65.             Log.e(TAG, "", e);
     
  66.         }
     
  67.         mCallbacks.finishBroadcast();
     
  68.     }
     

  69.  
  70.     private Handler mHandler = new Handler() {
     

  71.  
  72.         @Override
     
  73.         public void handleMessage(Message msg) {
     
  74.             callBack();
     
  75.             super.handleMessage(msg);
     
  76.         }
     
  77.     };
     
  78. }
     
  79. </icallback></icallback>
復制代碼

然後是activity:

  1. package com.zhang.test;
     

  2.  
  3. import android.app.Activity;
     
  4. import android.content.ComponentName;
     
  5. import android.content.Context;
     
  6. import android.content.Intent;
     
  7. import android.content.ServiceConnection;
     
  8. import android.os.Bundle;
     
  9. import android.os.IBinder;
     
  10. import android.os.RemoteException;
     
  11. import android.util.Log;
     

  12.  
  13. import com.zhang.test.service.ICallback;
     
  14. import com.zhang.test.service.IService;
     
  15. import com.zhang.test.service.MainService;
     

  16.  
  17. public class MainActivity extends Activity {
     

  18.  
  19.     private static final String TAG = "MainActivity";
     

  20.  
  21.     private IService mService;
     

  22.  
  23.     /** Called when the activity is first created. */
     
  24.     @Override
     
  25.     public void onCreate(Bundle savedInstanceState) {
     
  26.         super.onCreate(savedInstanceState);
     
  27.         setContentVIEw(R.layout.main);
     
  28.         Intent i = new Intent(this, MainService.class);
     
  29.         bindService(i, mConnection, Context.BIND_AUTO_CREATE);
     
  30.     }
     

  31.  
  32.     @Override
     
  33.     protected void onDestroy() {
     
  34.         if(mService!=null){
     
  35.             try {
     
  36.                 mService.unregisterCallback(mCallback);
     
  37.             } catch (RemoteException e) {
     
  38.                 Log.e(TAG, "", e);
     
  39.             }
     
  40.         }
     
  41.         //destroy的時候不要忘記unbindService
     
  42.         unbindService(mConnection);
     
  43.         super.onDestroy();
     
  44.     }
     

  45.  
  46.     /**
     
  47.      * service的回調方法
     
  48.      */
     
  49.     private ICallback.Stub mCallback = new ICallback.Stub() {
     

  50.  
  51.         @Override
     
  52.         public void showResult(int result) {
     
  53.             Log.d(TAG, " result : " + result);
     
  54.         }
     
  55.     };
     

  56.  
  57.     /**
     
  58.      * 注冊connection
     
  59.      */
     
  60.     private ServiceConnection mConnection = new ServiceConnection() {
     

  61.  
  62.         @Override
     
  63.         public void onServiceDisconnected(ComponentName name) {
     
  64.             Log.d(TAG, "onServiceDisconnected");
     
  65.             mService = null;
     
  66.         }
     

  67.  
  68.         @Override
     
  69.         public void onServiceConnected(ComponentName name, IBinder service) {
     
  70.             Log.d(TAG, "onServiceConnected");
     
  71.             mService = IService.Stub.asInterface(service);
     
  72.             try {
     
  73.                 mService.registerCallback(mCallback);
     
  74.             } catch (RemoteException e) {
     
  75.                 Log.e(TAG, "", e);
     
  76.             }
     
  77.         }
     
  78.     };
     
  79. }
復制代碼

最後不要忘記在manifest中加上service標記:

  1. <service android:name=".service.MainService">
     
  2. </service>
復制代碼

運行程序,查看Logcat
結果如下:
 1_jpg_thumb.jpg


總結:
通過aidl總算實現了Service與Activity的通信,寫起來麻煩點,使用諸如ContentProvider,Broadcast等也可以實現.
這樣做很像是在使用MVC設計模式(Activity負責VIEw,Service以及其他類負責 Model,aidl(ServiceConnection)負責Controller),其實我對於aidl也是一知半解- -,明天研究下如何讓activity去調用service中的方法.

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