这几天搞了搞AIDL,终于弄明白了在AIDL中让Service调用Activity的方法
代码:
然后再建立一个IService.aidl用来在Activity中接收Service回调,以及在Service中onBind时返回的Binder
注意:aidl中import不能写com.xxx.*,要写全类的路径
接下来是service:
MainService.java
然后是activity:
最后不要忘记在manifest中加上service标记:
代码:
首先建立一个ICallback.aidl文件,作为Activity中的回调方法
- packagecom.zhang.test.service;
- interfaceICallback{
- voidshowResult(intresult);
- }
然后再建立一个IService.aidl用来在Activity中接收Service回调,以及在Service中onBind时返回的Binder
注意:aidl中import不能写com.xxx.*,要写全类的路径
- packagecom.zhang.test.service;
- importcom.zhang.test.service.ICallback;
- interfaceIService{
- voidregisterCallback(ICallbackcb);
- voidunregisterCallback(ICallbackcb);
- }
MainService.java
- packagecom.zhang.test.service;
- importandroid.app.Service;
- importandroid.content.Intent;
- importandroid.os.Handler;
- importandroid.os.IBinder;
- importandroid.os.Message;
- importandroid.os.RemoteCallbackList;
- importandroid.os.RemoteException;
- importandroid.util.Log;
- publicclassMainServiceextendsService{
- privatestaticfinalStringTAG="MainService";
- privateRemoteCallbackList<icallback>mCallbacks=newRemoteCallbackList<icallback>();
- privateIService.StubmBinder=newIService.Stub(){
- @Override
- publicvoidunregisterCallback(ICallbackcb){
- if(cb!=null){
- mCallbacks.unregister(cb);
- }
- }
- @Override
- publicvoidregisterCallback(ICallbackcb){
- if(cb!=null){
- mCallbacks.register(cb);
- }
- }
- };
- @Override
- publicIBinderonBind(Intentintent){
- Log.d(TAG,"onBind");
- returnmBinder;
- }
- @Override
- publicvoidonCreate(){
- Log.d(TAG,"onCreate");
- //这里不知道为什么,直接使用callback方法回调showResult
- //mCallbacks.beginBroadcast()是0,需要用handler延迟1000毫秒
- //也许是在activity中binService太耗时的原因?
- mHandler.sendEmptyMessageDelayed(0,1000);
- super.onCreate();
- }
- @Override
- publicvoidonDestroy(){
- mHandler.removeMessages(0);
- mCallbacks.kill();
- super.onDestroy();
- }
- privatevoidcallBack(){
- intN=mCallbacks.beginBroadcast();
- try{
- for(inti=0;i<N;i++){
- mCallbacks.getBroadcastItem(i).showResult(i);
- }
- }catch(RemoteExceptione){
- Log.e(TAG,"",e);
- }
- mCallbacks.finishBroadcast();
- }
- privateHandlermHandler=newHandler(){
- @Override
- publicvoidhandleMessage(Messagemsg){
- callBack();
- super.handleMessage(msg);
- }
- };
- }
- </icallback></icallback>
- packagecom.zhang.test;
- importandroid.app.Activity;
- importandroid.content.ComponentName;
- importandroid.content.Context;
- importandroid.content.Intent;
- importandroid.content.ServiceConnection;
- importandroid.os.Bundle;
- importandroid.os.IBinder;
- importandroid.os.RemoteException;
- importandroid.util.Log;
- importcom.zhang.test.service.ICallback;
- importcom.zhang.test.service.IService;
- importcom.zhang.test.service.MainService;
- publicclassMainActivityextendsActivity{
- privatestaticfinalStringTAG="MainActivity";
- privateIServicemService;
- /**Calledwhentheactivityisfirstcreated.*/
- @Override
- publicvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- Intenti=newIntent(this,MainService.class);
- bindService(i,mConnection,Context.BIND_AUTO_CREATE);
- }
- @Override
- protectedvoidonDestroy(){
- if(mService!=null){
- try{
- mService.unregisterCallback(mCallback);
- }catch(RemoteExceptione){
- Log.e(TAG,"",e);
- }
- }
- //destroy的时候不要忘记unbindService
- unbindService(mConnection);
- super.onDestroy();
- }
- /**
- *service的回调方法
- */
- privateICallback.StubmCallback=newICallback.Stub(){
- @Override
- publicvoidshowResult(intresult){
- Log.d(TAG,"result:"+result);
- }
- };
- /**
- *注册connection
- */
- privateServiceConnectionmConnection=newServiceConnection(){
- @Override
- publicvoidonServiceDisconnected(ComponentNamename){
- Log.d(TAG,"onServiceDisconnected");
- mService=null;
- }
- @Override
- publicvoidonServiceConnected(ComponentNamename,IBinderservice){
- Log.d(TAG,"onServiceConnected");
- mService=IService.Stub.asInterface(service);
- try{
- mService.registerCallback(mCallback);
- }catch(RemoteExceptione){
- Log.e(TAG,"",e);
- }
- }
- };
- }
- <serviceandroid:name=".service.MainService">
- </service>