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

来源:互联网 发布:windows声卡驱动 编辑:程序博客网 时间:2024/05/16 09:15

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

Java代码  收藏代码
  1. package com.zhang.test.service;  
  2.   
  3.      interface ICallback {  
  4.      void showResult(int result);  //也可是是一个实现了parcel able的对象,由于是服务器端创建这个对象传给客户端,要加上out 修饰
  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.          @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标记:


Html代码  收藏代码
  1. <service android:name=".service.MainService">  
  2. </service>  

原创粉丝点击