Android(安卓)使用 AIDL 实现进程间通信,使用基本类型作为输入和输出参数
16lz
2021-01-24
RemoteService
1. 定义 IRemoteService.aidl
packagecom.zaoqibu.remoteservice;//Declareanynon-defaulttypesherewithimportstatementsinterfaceIRemoteService{/**RequesttheprocessIDofthisservice,todoevilthingswithit.*/intgetPid();/**DemonstratessomebasictypesthatyoucanuseasparametersandreturnvaluesinAIDL.*/voidbasicTypes(intanInt,longaLong,booleanaBoolean,floataFloat,doubleaDouble,StringaString);}
定义了两个方法,输入和输出参数都是简单类型(int, long, boolean, float, double, String)。
编译程序,将会在 build/generated/ 目录下生成 IRemoteService.java 的文件,里面有 IRemoteService.Stub 服务的存根代理类。
2. 创建服务 RemoteService 类
publicclassRemoteServiceextendsService{privatestaticfinalStringTAG="RemoteService";@OverridepublicvoidonCreate(){super.onCreate();}@OverridepublicIBinderonBind(Intentintent){returnbinder;}privatefinalIRemoteService.Stubbinder=newIRemoteService.Stub(){publicintgetPid(){returnProcess.myPid();}publicvoidbasicTypes(intanInt,longaLong,booleanaBoolean,floataFloat,doubleaDouble,StringaString){Stringstr=String.format("anInt:%d,aLong:%d,aBoolean:%b,aFloat:%f,aDouble:%f,aString:%s",anInt,aLong,aBoolean,aFloat,aDouble,aString);Log.i(TAG,str);}};}
实现存根代理类 IRemoteService.Stub。
3. 在 AndroidManifest.xml 中声明 RemoteService
<serviceandroid:name=".RemoteService"android:process=":remote"><intent-filter><!--Thesearetheinterfacessupportedbytheservice,whichyoucanbindto.--><actionandroid:name="com.zaoqibu.remoteservice.IRemoteService"/></intent-filter></service>
Client
1. 从 RemoteService 工程中拷贝 IRemoteService.aidl 文件
保持原路径
2. 调用 IRemoteService 方法。
publicclassMainActivityextendsActionBarActivity{privatestaticfinalStringTAG="MainActivity";privateIRemoteServiceiremoteService;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);bindService(newIntent(IRemoteService.class.getName()),serviceConnection,BIND_AUTO_CREATE);}privateServiceConnectionserviceConnection=newServiceConnection(){//CalledwhentheconnectionwiththeserviceisestablishedpublicvoidonServiceConnected(ComponentNameclassName,IBinderservice){//FollowingtheexampleaboveforanAIDLinterface,//thisgetsaninstanceoftheIRemoteInterface,whichwecanusetocallontheserviceiremoteService=IRemoteService.Stub.asInterface(service);}//CalledwhentheconnectionwiththeservicedisconnectsunexpectedlypublicvoidonServiceDisconnected(ComponentNameclassName){Log.e(TAG,"Servicehasunexpectedlydisconnected");iremoteService=null;}};publicvoidonRemoteServiceProcessIDClick(Viewview){intprocessID=0;try{processID=iremoteService.getPid();iremoteService.basicTypes(1,2,true,3.3f,4.4,"hello");}catch(RemoteExceptione){e.printStackTrace();}TextViewremoteServiceProcessID=(TextView)findViewById(R.id.remoteServiceProcessID);remoteServiceProcessID.setText(String.valueOf(processID));}}
3. 运行
更多相关文章
- android 简单文件管理器的实现
- Android(安卓)Dialog 全屏
- android使用文件进行存储
- android 反编译工具
- [JAVA] Android用到的一些文件操作
- android AppWidget的使用以及利用Service TimerTask实现widget的
- Android(安卓)Spinner 文字居中、其下拉窗口文字居中,自定义Spinn
- Android(安卓)遍历文件夹,搜索指定扩展名的文件
- Android(安卓)EditText 自定义带删除按钮