现在的位置: 首页 > 综合 > 正文

关于 aidl

2013年09月10日 ⁄ 综合 ⁄ 共 4624字 ⁄ 字号 评论关闭

 

    AIDL简介

          AIDL(AndRoid接口描述语言)是一种借口描述语言; 编译器可以通过aidl文件生成一段代码,通过预先定义的接口达到两个进程内部通信进程的目的. 如果需要在一个Activity中, 访问另一个Service中的某个对象, 需要先将对象转化成AIDL可识别的参数(可能是多个参数), 然后使用AIDL来传递这些参数, 在消息的接收端, 使用这些参数组装成自己需要的对象.

    AIDL支持的类型

  1. 简单Java编程语言类型(int,boolean等)
  2. List
  3. List中的所有元素都必须是可支持的类型中的一个,包括其他AIDL生成接口和parcelables。List可以作为泛型类来灵活使用(比如List<String>)。而实际的接受方的类则总是ArrayList,尽管该方法将被生成来使用List接口。 

  4. Map
  5.  Map中的所有元素都必须是可支持的类型中的一个,包括其他AIDL生成接口和parcelables。泛型化的Maps(比如:Map<Stirng,Integer>)不被支持。而实际的接受方的类则总是HashMap,尽管该方法将被生成去使用Map接口。 

  6. CharSequence
  7.  CharSequence的作用是可以被TextView和其他Widget对象使用。 

    AIDL使用

    服务端

    例如目前编写的PushService

    在SRC目录中添加文件IPushService.aidl

     
    Eclipse会自动生成java文件,放在目录gen/包名/IPushService.java

    制作Service文件,来实现IPushService接口。

    那么一个AIDL就建好了,下面讲基本的使用

    客户端

    首先在新建的项目中添加IPushService.aidl文件,实验证明,IPushService.aidl文件只要定义的内容相同就OK了,至于在哪一个包里都是无所谓的。记得COPY过来的时候,更改一下import的内容。

    然后使用如下:

    由此我们也初步端倪了Android中的Service的部分用法,将在下面做部分说明;

              上面的代码其实是存在问题的。这里很多人说bindService和unbindService是要成双成对出现的否则将会出现一些错误,但在我看来并没有这个说明。为了解决由此出现ServiceConnectionLeaked的BUG,我们可以这么解决:

  1. 使用getApplicationContext()所获取的上下文来绑定和解绑定服务,这个时候即使不用unbindService也是不会出错的。具体原因还未深究。
  2. 如果不想用getApplicationContext(),那么就必须在结束Activity时运行解绑定操作。
  3. 如果unbindService(conn)中的conn没有被绑定到服务端,将报java.lang.IllegalArgumentException: Service not registered这样的错误。证明了这个方法不宜调用第二次。
  4. 当以startService的方式打开服务,即使当前服务没有绑定的对象也不会停止服务,除非stopService才能停止。反之如果先运行的是bindService,那么,只要当前的绑定对象都失去连接,就会停止服务。

    这里回过头来说明一些android中的service

    Service概念及用途:

    Android中的服务,它与Activity不同,它是不能与用户交互的,不能自己启动的,运行在后台的程序,如果我们退出应用时,Service进程并没有结束,它仍然在后台运行,那 我们什么时候会用到Service呢?比如我们播放音乐的时候,有可能想边听音乐边干些其他事情,当我们退出播放音乐的应用,如果不用Service,我 们就听不到歌了,所以这时候就得用到Service了,又比如当我们一个应用的数据是通过网络获取的,不同时间(一段时间)的数据是不同的这时候我们可以 用Service在后台定时更新,而不用每打开应用的时候在去获取。

    Service生命周期 :

    Android Service的生命周期并不像Activity那么复杂,它只继承了onCreate(),onStart(),onDestroy()三个方法,当我 们第一次启动Service时,先后调用了onCreate(),onStart()这两个方法,当停止Service时,则执行onDestroy()方法,这里需要注意的是,如果Service已经启动了,当我们再次启动Service时,不会在执行onCreate()方法,而是直接执行onStart()方法,具体的可以看下面的实例。

    关于ServiceConnectionLeaked的相关说法

  1. I guess, in your case, when you restart the activity 1, without previous unbind, the service connection is leaked. Do you call unbind in onDestroy method in your activities?
  2. 源文档 <http://markmail.org/message/ybxioiyqwbeagwdt>

  3. Activity 1 is already running and bound to the Service when you call it from Activity 2. There's your leak. See if you can put a test in Activity 1 before you bind to the service. If it is already running the service and bound, don't do it again. You might set a boolean flag in the Activity or Service when you start and bind to it then check for that before you call it and start again. That's my educated guess. Good luck.
  4. 源文档 <http://markmail.org/message/ybxioiyqwbeagwdt>

 

抱歉!评论已关闭.