现在的位置: 首页 > 综合 > 正文

使用android中的AIDL让Service与Activity通信(service回调activity)

2013年09月15日 ⁄ 综合 ⁄ 共 4053字 ⁄ 字号 评论关闭

这几天搞了搞AIDL,终于弄明白了在AIDL中让Service调用Activity的方法

代码:

首先建立一个ICallback.aidl文件,作为Activity中的回调方法

Java代码  收藏代码
  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.*,要写全类的路径

Java代码  收藏代码
  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

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(01000);  
  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:

Java代码  收藏代码
  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.          

抱歉!评论已关闭.