android AIDL的使用

来源:互联网 发布:网络金融p2p涉税 编辑:程序博客网 时间:2024/06/04 19:33
链接:https://www.nowcoder.com/questionTerminal/41305f5072ea478290a4e5b1681ba749
来源:牛客网

在这里先说几点:
1、AIDL用来跨进程调用Service
2、要用AIDL定义远程接口interface
3、怎样在android项目中定义一个.aidl后缀的文件.:
首先,在eclipse左上角点击File---new--File.出现如下图一所示,我们在package里定义一个接口名字为MyIcat,接口类里可以写方法,但注意一定不能有权限修饰,要把包名写上。我写的MyIcat.aidl文件内容如下截图二,就是定义了getColor(),和getWeight()两个方法。做完上述aidl文件的定义,保存,此时工程会自动编译,在gen文件下对应的包里会生成MyIcat.java文件如下图三。这个java文件里有Sub内部类。
图一                                                           图二

图三
4、建好了AIDL 远程接口,就该写自己的public class myService extends Service {。。。。。}
下边是我写的完整的myService类, 重点是16-27行很重要,创建一个对象mBinder,因为Stub继承于Binder,实现了自定义接口MyIcat.而Binder又是IBinder的实现类,所以mBinder是IBinder类对象.这个mBinder要作为OnBind()方法的返回值,传给ServiceConnection对象里的onServiceConnected(ComponentName name, IBinder service)第二个参数。这样通过这个返回的mBinder就可以与Service通信了。

5、写好了自己的Service类,接下来写自己的Activity类。里边三个重要工作,
  • 全局静态String型常量MY_SERVICE作为Intent.setAction(xx)的参数用来启动自定义的myService。
  • 定义Intent对象i,setAction(MY_SERVICE)
  • 定义一个按钮Button
  • 创建ServiceConnection类对象 sc,覆盖接口的未实现的方法。
6、按钮点击事件里通过bindService(, , )运行Srvice,该方法会去依次调用Service的onCreate()和onBind()方法。调用完onBind()后的返回值会传递给ServiceConnection对象的onServiceConnected(,)的第二个参数。

7、第49行特别重要,在AIDL中,因为OnBinder()方法返回的的是IBinder对象的代理,并不是直接返回IBinder对象,所以需要49行处理.

8、最重要的是要在AndroidManifest.xml中注册myService

9、运行结果,当你点击了按钮以后,在LogCat里看到运行结果如下图所示。

先运行了service的onCreate(),再运行了onBind(),这样Service连接成功回调onServiceConnected()方法。打印color,weight