zoukankan      html  css  js  c++  java
  • android aidl

    参考: http://blog.csdn.net/u014614038/article/details/48399935

    本文提供了一个关于AIDL使用的简单易懂的例子,分为客户端和服务端两部分,分别为客户端和服务端新建一个eclipse工程,实现了从客户端向服务端发送请求,服务端打印log的功能。

     

    客户端和服务端的源码结构如下:

    注意,由于客户端和服务端的aidl文件所在包名必须一样,而两个包名一样的程序在安装时会产生冲突,所以这里用了一个技巧,在客户端工程的AndroidManifest.xml里把包名指定为com.styleflying,所以大家就会看到gen目录下的R.java所在的包是com.styleflying而不是com.styleflying.AIDL

     

    整个交互流程如下:

    1.客户端通过绑定服务,获取了服务的句柄(本地代理对象);

    2.客户端执行onClick(),调用本地代理对象的invokTest()函数,本地代理对象调用mRemote.transact()发出远程调用请求(见   mInterface.java);

    3.服务端响应onTransact()执行this.invokTest(),并将执行结果返回;

     

    由于客户端只和本地代理对象即服务句柄通信,由代理对象进行真正的IPC操作,所以对客户端来说,IPC过程是透明的,调用远程操作如同调用本地操作一样。

    在客户端调用transact()时,会将服务描述DSCRIPTION写入到data里,在客户端onTransact时会验证,如果两个不一样,则不能通信。

    而DSCRIPTION是根据mInterface包名和接口名自动生成的,这就是为什么两个工程里的mInterface.aidl要在同一个包的原因。

     

    在这个过程中,mInterface.aidl起到了桥梁的作用,规定统一了客户端和服务端的通信接口,使得客户端和服务端得以成功的通信。

    具体的通信transact和onTransact的过程也就是利用Binder驱动通信的过程,在这里就不多叙述。

    最后补上两个工程的AndroidManifest.xml

     

    [java] view plain copy
     
     print?
    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
    3.       package="com.styleflying"  
    4.       android:versionCode="1"  
    5.       android:versionName="1.0">  
    6.     <application android:icon="@drawable/icon" android:label="@string/app_name">  
    7.         <activity android:name=".AIDL.mAIDLActivity"  
    8.                   android:label="@string/app_name">  
    9.             <intent-filter>  
    10.                 <action android:name="android.intent.action.MAIN" />  
    11.                 <category android:name="android.intent.category.LAUNCHER" />  
    12.             </intent-filter>  
    13.         </activity>  
    14.     </application>  
    15.     <uses-sdk android:minSdkVersion="8" />  
    16. </manifest>   
    [java] view plain copy
     
     print?
    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
    3.       package="com.styleflying.AIDL"  
    4.       android:versionCode="1"  
    5.       android:versionName="1.0">  
    6.     <application android:icon="@drawable/icon" android:label="@string/app_name">  
    7.         <service android:name=".mAIDLService">  
    8.                 <intent-filter>  
    9.                 <action android:name="com.styleflying.AIDL.service" />  
    10.                 <category android:name="android.intent.category.DEFAULT" />  
    11.             </intent-filter>  
    12.         </service>  
    13.     </application>  
    14.     <uses-sdk android:minSdkVersion="8" />  
    15. </manifest>   

    http://blog.csdn.net/u014614038/article/details/48399935

  • 相关阅读:
    JDK中ClassLoader的分类以及ClassLoader间的层次关系
    java动态加载机制
    hibernate_boolean类型的处理
    hibernate_annotation字段映射位置
    hibernate基本配置
    hibernate3.3.2搭建Junit日志环境
    hibernate基本配置show_sql、sql_format
    hibernate3.3.2搭建log4j日志环境
    ios错误ignoring file xxx missing required architecture x86_64 in file
    转载 【iOS开发】网页JS与OC交互(JavaScriptCore) OC ----->JS
  • 原文地址:https://www.cnblogs.com/alamps/p/6080582.html
Copyright © 2011-2022 走看看