在UI线程和Service线程中经常需要进行数据通信,而除了Bundles之外的另一种方法便为AIDL,Demo(Pedometer)步骤、逻辑及代码:

首先先编辑好两个.aidl文件:

IsStepService.aidl:

import

com.jwetherell.pedometer.service.IStepServiceCallback;

interface IStepService {

boolean isRunning();

void setSensitivity(int

sens);

void

registerCallback(IStepServiceCallback cb);

void

unregisterCallback(IStepServiceCallback cb);

}

IsStepServiceCallback.aidl:

interface IStepServiceCallback {

void stepsChanged(int value);

}

第二,实例化两个远程接口:

因为这个程序是一个客户端和一个服务端,而且是相互调用的关系,所以要在客户端中实现IStepServiceCallback:

private static final IStepServiceCallback.Stub mCallback = new

IStepServiceCallback.Stub() {

@Override

public IBinder asBinder() {

return mCallback;

}

@Override

public void stepsChanged(int value) throws RemoteException {

logger.info("Steps=" + value);

Message msg = handler.obtainMessage();

msg.arg1 = value;

handler.sendMessage(msg);

}

};

而在服务端中实现IStepService:

private final IStepService.Stub mBinder = new

IStepService.Stub() { @Override

public boolean isRunning() throws RemoteException {

return running;

}

@Override

public void setSensitivity(int sens) throws RemoteException {

logger.info("setSensitivity: " + sens);

StepDetector.setSensitivity(sens);

}

@Override

public void registerCallback(IStepServiceCallback cb) throws

RemoteException {

if (cb == null) return;

logger.info("registerCallback: " + cb.toString());

cb.stepsChanged(mSteps);

if (!mCallbacks.contains(cb)) mCallbacks.add(cb);

}

@Override

public void unregisterCallback(IStepServiceCallback cb) throws

RemoteException {

if (cb == null) return;

logger.info("unregisterCallback: " + cb.toString());

if (mCallbacks.contains(cb)) mCallbacks.remove(cb);

}

};

最后,就可以利用BindService以及实例化的aidl去实现通信了。

但是值得注意的是,在客户端实例化ServiceConnection并重载onServiceConnected(ComponentName

className, IBinder service)方法时,需要做以下两步:

mService =

IStepService.Stub.asInterface(service);

mService.registerCallback(mCallback);

step1利用aidl的asInterface方法增加一个IStepService实例,step2是将增加的实例注册回调,而且IStepService是在服务端定义的,mCallback则是客户端通过IStepServiceCallback.Stub实例化的。反过来看服务端的IBinder:

public IBinder onBind(Intent intent) {

return mBinder;

}

其中mBinder是IStepService.Stub实例化的,而且IStepService.Stub同样是在客户端定义的。这样,服务端就能调用客户端的方法。

android封装aidl接口,Android远端接口AIDL及服务回调用法相关推荐

  1. android 封装的popwindow,Android UI开发 popupwindow介绍以及代码实例

    PopupWindow在android.widget包下,弹出窗口的形式展示.官方文档对该控件的描述是:"一个弹出窗口控件,可以用来显示任意视图(View),而且会浮动在当前 活动(acti ...

  2. android 封装状态页面,Android 缺省页状态切换方案

    MultiStatePage MultiStatePage的功能及特点 无需在布局添加视图代码 可显示自定义状态视图,任意拓展 可用于 Activity.Fragment.或指定的 View 自定义重 ...

  3. delphi android jni,Delphi使用android的NDK是通过JNI接口,封装好了,不用自己写本地代码,直接调用...

    一.Android平台编程方式: 1.基于Android SDK进行开发的第三方应用都必须使用Java语言(Android的SDK基于Java实现) 2.自从ndk r5发布以后,已经允许完全用C/C ...

  4. android studio 跨进程,Android IPC机制(三)在Android Studio中使用AIDL实现跨进程方法调用...

    本文首发于微信公众号「后厂技术官」 在上一篇文章Android IPC机制(二)用Messenger进行进程间通信中我们介绍了使用Messenger来进行进程间通信的方法,但是我们能发现Messeng ...

  5. android IPC通信(下)-AIDL

    android IPC通信(上)-sharedUserId&&Messenger android IPC通信(中)-ContentProvider&&Socket 这篇 ...

  6. Android的IPC机制(一)——AIDL的使用

    综述 IPC(interprocess communication)是指进程间通信,也就是在两个进程间进行数据交互.不同的操作系统都有他们自己的一套IPC机制.例如在Linux操作系统中可以通过管道. ...

  7. aidl使用_借助 AIDL 理解 Android Binder 机制——Binder 来龙去脉

    AIDL 是 Android Interface Definition Language(Android 接口定义语言)的缩写,它是 Android 进程间通信的接口语言.由于 Android 系统的 ...

  8. Android AIDL使用介绍(3) 浅说AIDL背后的Binder

    1.背景 在前面的博客中,我们已经学会了使用AIDL进行跨进程通信,AIDL的使用比较简单,可实际上跨进程通信是一个相当复杂的过程,例如进程A是怎么找到进程B的,如果有一个进程C冒充进程A,进程B又该 ...

  9. Android IPC系列(一):AIDL使用详解

    概述 AIDL可以实现进程间的通信,由于每个进程都是运行在独立的空间,不同的进程想要交互需要借助一些特殊的方式,AIDL就是其中的一种,AIDL是一种模板,因为实际交互过程中,并不是AIDL起的作用, ...

最新文章

  1. 深入理解多线程(二)—— Java的对象模型
  2. 深度之眼课程打卡-统计学习方法01
  3. 小程序之旅——第六站(模板首页)
  4. java web 自定义异常_Java web, service 层应该通过异常(自定义Exception)来中断业务吗?...
  5. (转)Hibernate框架基础——一对多关联关系映射
  6. 一些OEM的厂商的漏洞分析
  7. 【MyBatis笔记】使用注解开发
  8. iOS 关于单例那点事
  9. 【Unity3D】GUI控件
  10. 页面修饰框架SiteMesh的简单使用
  11. 低功耗视频解码芯片-TVP5150
  12. 自建 IPA 分发平台
  13. 汽车厂VIN码生成软件
  14. “ 流量or变现 “ 网销50条干货必备
  15. linux分屏显示命令文件夹,Linux简易命令整理
  16. BUUCTF_Crypto_[MRCTF2020]天干地支+甲子
  17. R语言工具变量与两阶段最小二乘法
  18. 如何在Ubuntu系统下使用扫描仪(by quqi99)
  19. 互联网晚报 | 07月02日 星期六 | ​​​北京健康宝核酸检测天数计算规则调整;​上海鼓励用人单位吸纳失业3个月及以上人员...
  20. asp.net gridview ItemTemplate 获得 一行 数据

热门文章

  1. Django中使用缓存
  2. 十二、安装redis3.2
  3. 30-Python3 正则表达式
  4. 学生群体中奖励制度的马太效应
  5. 【例题5-6 UVA 540 】Team Queue
  6. iOS控制器与视图加载方法
  7. Docker介绍及安装
  8. 未能加载文件或程序集“System.Runtime.Serialization, Version=2.0.5.0, Culture=neutral,
  9. 使用haskell来解线性方程
  10. React基础篇(四)之创建组件方式分析