文档章节

【专题】Android AIDL使用

老牟
 老牟
发布于 2014/04/30 10:24
字数 1025
阅读 421
收藏 0
点赞 0
评论 0

文章不讲如何简单的创建AIDL,会使用项目中实际的例子来说如何使用,也方便了解了AIDL的同学却不知道在什么情况下使用的。    

先来了解下AIDL,英文全称叫Android Interface definition language,是Android系统内部进程通信接口的描述语言,它作为两个进程间通讯的接口。    

下面就来介绍一个项目中实际使用AIDL的例子。    

客户需求可以在第三方APP里调用系统设置的接口,如果要达到这个目的,由于是第三方APP(即使用Android SDK开发的APP),无法直接调用这些系统接口(包括权限问题,隐藏API问题),只有通过在系统设置里面创建AIDL服务接口,在第三方APP里面调用这些接口,就能实现客户的需求。    

那么AIDL工作的方式是什么呢?你可以理解为一个服务端,一个客户端,客户端请求服务端调用工作,如果有必要服务端还会调用客户端提供的接口。    

首先来看服务端该做什么

路径:/packages/apps/Settings

1 创建AIDL文件    

创建文件/packages/apps/Settings/src/com/xxx/agent/IExperienceAgentService.aidl    

package com.xxx.agent;

interface IExperienceAgentService {
    void setTimeZone(String timeZone);
}

2 创建文件 /packages/apps/Settings/src/com/xxx/agent/ExperienceAgentService.java (名字跟AIDL文件名没有直接关系,可以不同)    

package com.xxx.agent;

public class ExperienceAgentService extends Service {

    // AIDL文件接口实现
    public class ExperienceAgentServiceImpl extends IDoroExperienceAgentService.Stub {
        @Override
        public void setTimeZone(String timeZone) throwsRemoteException {
            Log.d(TAG, "timeZone="+timeZone);
            try {
                mAlarmManager.setTimeZone(timeZone);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    @Override
    public  IBinder onBind(Intent intent) {
        return newExperienceAgentServiceImpl ();
    }
}

好服务端代码基本上就写完了,然后编译,需要修改Android.mk文件    

添加     

LOCAL_SRC_FILES += \    

         src/com/xxx/agent/IExperienceAgentService.aidl

还需要在AndroidManifest.xml 里面注册创建的服务

添加    

 <service android:name="com.xxx.agent.ExperienceAgentService" >
     <intent-filter>
         <action android:name="com.xxx.agent.IExperienceAgentService" />  // action name 可以自定义
     </intent-filter>
 </service>

再来看看客户端该做什么,首先肯定需要启动绑定服务,然后再调用服务。

客户端包名 com.xxx.client

1 创建AIDL文件      

拷贝服务端创建的AIDL文件到客户端目录,路径 com/xxx/agent/IExperienceAgentService.aidl,注意包路径必须一样,文件内容也必须一样。      

2 绑定服务      

package com.xxx.client;

import com/xxx/agent/IExperienceAgentService;

public class Client extends Activity {
    private IExperienceAgentServicemService = null;
    private ServiceConnection mConnection = new ServiceConnection() {
         // 连接服务端成功
         public void onServiceConnected(ComponentName className, IBinder service) {
             IExperienceAgentServicemService  = IExperienceAgentService.Stub.asInterface(service);
         }
         //服务端连接断开
         public void onServiceDisconnected(ComponentName className) {
             IExperienceAgentServicemService  = null;
         }
    }
    @Override
    protected void onStart() {
        super.onStart();
        // 绑定服务,Intent 选择服务端AndroidManifest注册的action
        bindService(new Intent(”com.xxx.agent.IExperienceAgentService“, mConnection, Context.BIND_AUTO_CREATE);
    }
     @Override
    protected void onStop() {
        super.onStop();
        unbindService(mConnection);
    }
    @Override
    public void onClick(View v) {
        if (IExperienceAgentServicemService != null) {
            try {
               // 调用AIDI接口文件方法
               IExperienceAgentServicemService.setTimeZone("shanghai");
            } catch (RemoteException e) {
               e.printStackTrace();
            } 
        }
    }
}

至此,客户端代码也就编写完成了


下面在来看看服务端调用客户端提供的接口是怎么工作的呢 

服务端需要修改的如下 

1 创建AIDL文件      

创建文件/packages/apps/Settings/src/com/xxx/agent/ICallback.aidl      

package com.xxx.agent;

interface ICallback{
    void updateTimeZone(String timeZone);
}

修改/packages/apps/Settings/src/com/xxx/agent/IExperienceAgentService.aidl      

package com.xxx.agent;

import com.xxx.agent.ICallback;

interface IExperienceAgentService {
    void setTimeZone(ICallback cb, String timeZone);
}

修改/packages/apps/Settings/src/com/xxx/agent/ExperienceAgentService.java      

package com.xxx.agent;

public class ExperienceAgentService extends Service {

    // AIDL文件接口实现
    public class ExperienceAgentServiceImpl extends IDoroExperienceAgentService.Stub {
        @Override
        public void setTimeZone(ICallback cb, String timeZone) throwsRemoteException {
            Log.d(TAG, "timeZone="+timeZone);
            try {
                mAlarmManager.setTimeZone(timeZone);
            } catch (Exception e) {
                e.printStackTrace();
            }
            cb.updateTimeZone(timeZone);
        }
    }

    @Override
    public  IBinder onBind(Intent intent) {
        return newExperienceAgentServiceImpl ();
    }
}

客户端需要修改的如下      

1 拷贝服务端创建的ICallback.aidl文件到客户端目录,路径 com/xxx/agent/ICallback.aidl      

2 绑定服务      

package com.xxx.client;

import com/xxx/agent/IExperienceAgentService;
import com/xxx/agent/ICallback;

public class Client extends Activity {
    public class Callback extends ICallback.Stub
        @Override
        public void updateTimeZone(String timeZone) throwsRemoteException {
            Message msg = new Message();
            msg.obj = timeZone;
            mHandler.sendMessage(msg);
       }
    }

    @Override
    public void onClick(View v) {
        if (IExperienceAgentServicemService != null) {
            try {
               // 调用AIDI接口文件方法
               IExperienceAgentServicemService.setTimeZone(new Callback(), "shanghai");
            } catch (RemoteException e) {
               e.printStackTrace();
            } 
        }
    }
    
    private Handler mHandler = new Handler() {
        @Override 
        public void handleMessage(Message msg) {
             // 进行界面更新
        }
    }
}

至此AIDL服务端回调接口也已经完了。      

Google官方介绍链接:http://developer.android.com/guide/components/aidl.html 


© 著作权归作者所有

共有 人打赏支持
老牟
粉丝 13
博文 20
码字总数 8401
作品 0
成都
程序员
Android AIDL浅析及异步调用

AIDL:Android Interface Definition Language,即 Android 接口定义语言。 AIDL 是什么 Android 系统中的进程之间不能共享内存,因此,需要提供一些机制在不同进程之间进行数据通信。 为了使其...

cspecialy ⋅ 05/20 ⋅ 0

Android中实现跨进程通信(IPC)的几种方式(二)

Android中实现跨进程通信(IPC)的几种方式(二)     在上一篇文章中介绍了什么是多进程,为什么需要多进程,多进程的优缺点等。这篇我们将会使用AIDL来实现跨进程通信。 1.什么是AIDL  ...

huangandroid ⋅ 05/26 ⋅ 0

Android 平台上轻量级的组件间通信框架 - Andromeda

Andromeda是爱奇艺开源的一个Android平台上轻量级的组件间通信框架,主要特征如下: 不需要开发者进行bindService操作,即可实现不同进程的任意两个组件间的IPC通信; 即使不在同一进程,也可同...

匿名 ⋅ 04/20 ⋅ 0

基于JSON RPC的一种Android跨进程调用解决方案了解一下?

基于JSON RPC的一种Android跨进程调用解决方案了解一下? 基于JSON RPC的一种Android跨进程调用解决方案了解一下? 简介 今天上午,看票圈有朋友分享爱奇艺的跨进程通信框架——Andromeda,觉...

流水不腐小夏 ⋅ 05/30 ⋅ 0

AIDL跨进程Service推送消息到Activity

AIDL的概念不说了,一般都是Activity调用service的方法去获取一些东西,但是如何做到service主动回调activity的方法去推送一些东西的,这种需求一般也是会有的(比如后台有个定位,每次位置更新或...

倔强码农 ⋅ 04/11 ⋅ 0

人人都会设计模式:05、代理模式--Proxy

教程简介 1、阅读对象 本篇教程适合新手阅读,老手直接略过 2、教程难度 初级,本人水平有限,文章内容难免会出现问题,如果有问题欢迎指出,谢谢 正文 一、什么是代理模式 1、生活中的代理 ...

TigerChain ⋅ 06/15 ⋅ 0

Android中实现跨进程通信(IPC)的方式(三)之观察者模式

Android中实现跨进程通信(IPC)的方式(三)之观察者模式 前言     在Android中实现跨进程通信(IPC)的几种方式(一)中介绍了什么是多进程,为什么需要多进程,多进程的优缺点等。这篇我们将...

huangandroid ⋅ 06/03 ⋅ 0

Android 8.0(Android O) AccountManager 行为变更

前言 在公司的项目中,使用 AccountManager 统一管理//获取帐号列表/或对应帐号类型的某个帐号 AccountManager#getAccounts()/getAccountsByType(String accountType) 获取不到 AccountManag...

xujun9411 ⋅ 05/02 ⋅ 0

Andromeda:适用于多进程架构的组件通信框架(下)

  首先插播一条自己的广告——有些朋友可能都知道了,我最近创建了一个知识星球,在这里试了一周,发现私密圈子的效率果然比群要好很多,付费门槛过滤掉了大部分广告和没有意愿学习分享的人...

Android群英传 ⋅ 05/29 ⋅ 0

Android开发权威指南(第2版)新书发布

《Android开发权威指南(第二版)》是畅销书《Android开发权威指南》的升级版,内容更新超过80%,是一本全面介绍Android应用开发的专著,拥有45章精彩内容供读者学习。  《Android开发权威指...

androidguy ⋅ 2013/09/05 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

个人博客的运营模式能否学习TMALL天猫质量为上?

心情随笔|个人博客的运营模式能否学习TMALL天猫质量为上? 中国的互联网已经发展了很多年了,记得在十年前,个人博客十分流行,大量的人都在写博客,而且质量还不错,很多高质量的文章都是在...

原创小博客 ⋅ 今天 ⋅ 0

JavaScript零基础入门——(十一)JavaScript的DOM操作

JavaScript零基础入门——(十一)JavaScript的DOM操作 大家好,欢迎回到我们的JavaScript零基础入门。最近有些同学问我说,我讲的的比书上的精简不少。其实呢,我主要讲的是我在开发中经常会...

JandenMa ⋅ 今天 ⋅ 0

volatile和synchronized的区别

volatile和synchronized的区别 在讲这个之前需要先了解下JMM(Java memory Model :java内存模型):并发过程中如何处理可见性、原子性、有序性的问题--建立JMM模型 详情请看:https://baike.b...

MarinJ_Shao ⋅ 今天 ⋅ 0

深入分析Kubernetes Critical Pod(一)

Author: xidianwangtao@gmail.com 摘要:大家在部署Kubernetes集群AddOn组件的时候,经常会看到Annotation scheduler.alpha.kubernetes.io/critical-pod"="",以表示这是一个关键服务,那你知...

WaltonWang ⋅ 今天 ⋅ 0

原子性 - synchronized关键词

原子性概念 原子性提供了程序的互斥操作,同一时刻只能有一个线程能对某块代码进行操作。 原子性的实现方式 在jdk中,原子性的实现方式主要分为: synchronized:关键词,它依赖于JVM,保证了同...

dotleo ⋅ 今天 ⋅ 0

【2018.06.22学习笔记】【linux高级知识 14.4-15.3】

14.4 exportfs命令 14.5 NFS客户端问题 15.1 FTP介绍 15.2/15.3 使用vsftpd搭建ftp

lgsxp ⋅ 今天 ⋅ 0

JeeSite 4.0 功能权限管理基础(Shiro)

Shiro是Apache的一个开源框架,是一个权限管理的框架,实现用户认证、用户授权等。 只要有用户参与一般都要有权限管理,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户...

ThinkGem ⋅ 昨天 ⋅ 0

python f-string 字符串格式化

主要内容 从Python 3.6开始,f-string是格式化字符串的一种很好的新方法。与其他格式化方式相比,它们不仅更易读,更简洁,不易出错,而且速度更快! 在本文的最后,您将了解如何以及为什么今...

阿豪boy ⋅ 昨天 ⋅ 0

Python实现自动登录站点

如果我们想要实现自动登录,那么我们就需要能够驱动浏览器(比如谷歌浏览器)来实现操作,ChromeDriver 刚好能够帮助我们这一点(非谷歌浏览器的驱动有所不同)。 一、确认软件版本 首先我们...

blackfoxya ⋅ 昨天 ⋅ 0

线性回归原理和实现基本认识

一:介绍 定义:线性回归在假设特证满足线性关系,根据给定的训练数据训练一个模型,并用此模型进行预测。为了了解这个定义,我们先举个简单的例子;我们假设一个线性方程 Y=2x+1, x变量为商...

wangxuwei ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部