Android实现跨进程接口回掉的方法
前言
同一个进程内实现接口回掉很简单,这里不做叙述,本文主要讲的是跨进程的接口回掉实现方式。有一种跨进程通信的方式就是使用AIDL,但是单纯的AIDL通信只可以实现客户端访问服务端主动获取Binder对象,如果服务端有变化无法及时通知客户端。现在可以通过AIDL跨进程接口回掉来解决服务端发生变化通知客户端的问题。
谷歌提供了RemoteCallbackList来实现对IInterface的管理。publicclassRemoteCallbackList
首先定义两个AIDL文件:
1.ITestCallBack.aidl
interfaceITestCallBack{ /** *Demonstratessomebasictypesthatyoucanuseasparameters *andreturnvaluesinAIDL. */ voidonTagValid(inStringtag); }
2.ITestInterface.aidl 在注册和反祖册方法中,需要传入ITestCallBack的对象
interfaceITestInterface{ /** *Demonstratessomebasictypesthatyoucanuseasparameters *andreturnvaluesinAIDL. */ booleanisTagValid(inStringtag); voidregisterCallback(inStringtag,inITestCallBackcallback); voidunRegisterCallback(inStringtag,inITestCallBackcallback); }
服务端:
创建Service,并且在service中定义RemoteCallbackList集合,实现ITestInterface.Stub,在registerCallback,和unRegisterCallback中,分别将ITestCallBack对象注册和反注册进RemoteCallbackList中。RemoteCallbackList提供了获取注册进去的IInterface对象方法
//其实RemoteCallbackList类似于java中{@linkjava.util.Observable},用来批量处理接口回调对象, //其实如果确保只有一个客户端会bind到这个服务,只需要保存一个IMyAidlInterfaceCallback即可。 //但是如果有多个,强烈推荐使用其实RemoteCallbackList publicvoidcallBack(){ if(mCallBacks==null){ return; } intnum=mCallBacks.beginBroadcast(); for(inti=0;i在isTagValid中可以调用callBack方法去遍历注册的接口对象,也可以当服务端有变化时主动调用callBack方法去通知客户端,这样就实现了服务端变化主动通知客户端。可根据实际方法修改。
在service的onBind方法中,返回ITestInterface.Stub的对象即可,等待客户端绑定服务端。
下面是服务端Service的代码:
publicclassTestServiceextendsService{ privateRemoteCallbackListmCallBacks=newRemoteCallbackList<>(); privateStringtag="hy"; publicTestService(){ } @Override publicIBinderonBind(Intentintent){ //TODO:Returnthecommunicationchanneltotheservice. returniTestInterface; } @Override publicbooleanonUnbind(Intentintent){ returnsuper.onUnbind(intent); } ITestInterface.StubiTestInterface=newITestInterface.Stub(){ @Override publicbooleanisTagValid(Stringtag)throwsRemoteException{ if(tag.equals(TestService.this.tag)){ callBack(); returntrue; } returnfalse; } @Override publicvoidregisterCallback(Stringtag,ITestCallBackcallback)throwsRemoteException{ if(null!=mCallBacks&&null!=callback){ mCallBacks.register(callback); } } @Override publicvoidunRegisterCallback(Stringtag,ITestCallBackcallback)throwsRemoteException{ if(null!=mCallBacks&&null!=callback){ mCallBacks.unregister(callback); } } }; publicvoidcallBack(){ if(mCallBacks==null){ return; } intnum=mCallBacks.beginBroadcast(); for(inti=0;i 客户端:
客户端首先要做的是绑定服务端,实现AIDL的通信,在客户端创建绑定按钮,解绑按钮,和主动获取信息的通信按钮。在主动获取信息的通信按钮中实现iTestInterface对象的isTagValid方法可以主动去获取服务端的信息(服务端在isTagValid方法中调用了callBack方法)。
客户端代码:
publicclassMainActivityextendsAppCompatActivity{ privateStringtag="hy"; privateITestInterfaceiTestInterface; privateServiceConnectionconnection=newServiceConnection(){ @Override publicvoidonServiceConnected(ComponentNamename,IBinderservice){ iTestInterface=ITestInterface.Stub.asInterface(service); } @Override publicvoidonServiceDisconnected(ComponentNamename){ iTestInterface=null; } }; @Override protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); bindService(); ((Button)findViewById(R.id.buttonregister)).setOnClickListener(newView.OnClickListener(){ @Override publicvoidonClick(Viewv){ try{ iTestInterface.registerCallback(tag,newITestCallBack.Stub(){ @Override publicvoidonTagValid(Stringtag)throwsRemoteException{ Log.e("test","registerCallback:"+tag); } }); }catch(RemoteExceptione){ e.printStackTrace(); } } }); ((Button)findViewById(R.id.buttonunregister)).setOnClickListener(newView.OnClickListener(){ @Override publicvoidonClick(Viewv){ try{ iTestInterface.unRegisterCallback(tag,newITestCallBack.Stub(){ @Override publicvoidonTagValid(Stringtag)throwsRemoteException{ } }); }catch(RemoteExceptione){ e.printStackTrace(); } } }); ((Button)findViewById(R.id.buttonisvalid)).setOnClickListener(newView.OnClickListener(){ @Override publicvoidonClick(Viewv){ try{ iTestInterface.isTagValid(tag); }catch(RemoteExceptione){ e.printStackTrace(); } } }); } privatevoidbindService(){ Intentintent=newIntent(); intent.setAction("com.example.heyang.myapplication.TestService"); intent.setPackage("com.example.heyang.myapplication"); booleansuccess=bindService(intent,connection,Context.BIND_AUTO_CREATE); if(success){ Log.e("test","bindServiceOK"); }else{ Log.e("test","bindServiceFail"); } } @Override protectedvoidonDestroy(){ super.onDestroy(); unBindeService(); } privatevoidunBindeService(){ try{ unbindService(connection); }catch(Exceptione){ e.printStackTrace(); } } }总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对毛票票的支持。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。