美文网首页
AIDL的使用步骤

AIDL的使用步骤

作者: charjack | 来源:发表于2018-06-13 10:23 被阅读0次

文章转载于:https://www.cnblogs.com/chase1/p/7135961.html

aidl远程调用传递的参数和返回值支持Java的基本类型(int long booen char byte等)和String,List,Map等。当然也支持一个自定义对象的传递。

服务端

1新建一个MyAidlDemoServer工程,然后在java目录下右键新建一个aidl File,然后在该目录下新建一个IMyAidlInterface.aidl文件,代码如下:

修改生成的.aidl文件中的内容

1interface IMyAidlInterface {23intadd(intarg1,int arg2);45}//aidl文件里面的代码不需要加任何修饰符

这里定义了一个IMyAidlInterface接口,里面定义的add方法用于求和计算。

然后Build当前工程(Build选项里的Make Project)。

会发现在app/build/generated/source/aidl/debug目录下会生成一个与IMyAidlInterface.aidl文件同样包名的一个文件,该文件下面自动生成IMyAidlInterface文件,该文件里面自动实现了一些方法用于远程调用。

编写远程服务

1新建MyService类继承Service,并实现以下代码。

1publicclass MyService extends Service { 2IMyAidlInterface.Stub mStub =new IMyAidlInterface.Stub() { 3        @Override 4publicintadd(intarg1,int arg2) throws RemoteException { 5returnarg1 + arg2; 6        } 7    }; 8 9    @Override10public IBinder onBind(Intent intent) {11return mStub;12    }13}

服务里的代码重写了IMyAidlInterface.Stub类中的 add方法,然后通过重写onBind()方法将重写的IMyAidlInterface.Stub类返回出去。

然后在AndroidManifest.xml对Service进行配置。

16789

这里设置了android:process属性,并且设置为":remote"。

android:process=":remote",代表在应用程序里,当需要该service时,会自动创建新的进程。而如果是android:process="remote",没有“:”分号的,则创建全局进程,不同的应用程序共享该进程。

然后添加了一个意图过滤器。

客户端

新建MyAidlDemoCustomer工程,然后直接把服务端的aidl目录直接拷贝到客户端的main目录下。这么一来客户端的aidl就无需编写了,直接和服务端的一模一样。包括路径的包名等。 当然也可以在客户端这边重新写aidl文件。

编辑布局文件:

1 2 5 611

这里只用了一个TextView来显示最终的计算结果。

然后编辑客户端的调用代码:

1publicclass MainActivity extends AppCompatActivity { 2 3        TextView tv; 4        IMyAidlInterface mStub; 5 6        @Override 7protectedvoid onCreate(Bundle savedInstanceState) { 8            super.onCreate(savedInstanceState); 9            setContentView(R.layout.activity_main);1011tv = (TextView)findViewById(R.id.tv);1213Intent intent =new Intent();14//由于是隐式启动Service 所以要添加对应的action,A和之前服务端的一样。15intent.setAction("co.example.leo.myService");16//android 5.0以后直设置action不能启动相应的服务,需要设置packageName或者Component。17intent.setPackage("co.example.leo.myaidldemoserver");//packageName 需要和服务端的一致.18            bindService(intent,serviceConnection,BIND_AUTO_CREATE);19        }2021privateServiceConnection serviceConnection =new ServiceConnection() {22            @Override23publicvoid onServiceConnected(ComponentName name, IBinder service) {24//调用asInterface()方法获得IMyAidlInterface实例25mStub = IMyAidlInterface.Stub.asInterface(service);26if(mStub ==null) {27Log.e("MainActivity","the mStub is null");28}else{//当mStub不为空就调用其add方法进行计算,并显示到TextView上面。29try {30intvalue = mStub.add(1,8);31tv.setText(value +"");32}catch (RemoteException e) {33                        e.printStackTrace();34                    }35                }36            }3738            @Override39publicvoid onServiceDisconnected(ComponentName name) {4041            }42        };434445        @Override46protectedvoid onDestroy(){47//解绑服务 48            super.onDestroy();49            unbindService(serviceConnection);50        }51}

最后安装上客户端和服务端,打开客户端后会发现已经调用了服务端的方法并计算出了结果。

总结

这是一个在AS下最简单的一个AIDL编程:

1.服务端创建一个aidl目录,然后在该目录下新建一个.aidl为后缀的接口类,该类定义远程调用的接口方法。

2.build编译之后会在app/build/generated/source/aidl/debug目录下会生成aidl远程实现类,该类是AS自动生成的。

3.在AndroidManifest.xml下配置Service的action和process属性。

4.将服务端的aidl目录拷贝到客户端相应的目录下,然后编写客户端调用代码,AS下简单的aidl编程就ok了。

相关文章

网友评论

      本文标题:AIDL的使用步骤

      本文链接:https://www.haomeiwen.com/subject/gttjeftx.html