首先我们新建两个工程文件:Server和Client,这里两个工程可以不创建Layout文件,因为这个实例中没用到图形化界面。

在Server工程中,我们先要把目录结构由默认的Android改为Project,Android目录结构便于开发但是目录结构很不清晰,而一会儿为了让Client工程能够调用我们在Server工程中编写的服务则必须要将aidl目录整个拷贝到Client完全一样的位置,所以必须搞清楚到底在Server工程中的哪个位置创建了aidl文件。

选中main文件夹右击New一个AIDL File,Android Studio会自动创建一个aidl文件夹

这里我们将AIDL文件起名为CalculateInterface,然后开始编写这个CalculateInteface.aidl文件。这个文件本质上就是一个接口,在这个接口中定义我们准备实现的功能。

然后我们在Server工程中新建一个Java类(RemoteService.java),在这个Java类中,我们将实现之前在aidl文件中定义的函数

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
import android.support.annotation.Nullable;public class RemoteService extends Service {public RemoteService() {} //constructor@Overridepublic void onCreate() {super.onCreate();System.out.println("run");}@Nullable@Overridepublic IBinder onBind(Intent intent) {return stub;}CaculateInterface.Stub stub = new CaculateInterface.Stub() {@Overridepublic void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString) throws RemoteException {}@Overridepublic double add(double a, double b) throws RemoteException {return a + b;} //add()@Overridepublic double subtract(double a, double b) throws RemoteException {return a - b;} //subtract()@Overridepublic double multiply(double a, double b) throws RemoteException {return a * b;} //multiply()@Overridepublic double divide(double a, double b) throws RemoteException {return a / b;} //divide()};}

最后在manifest中注册一下这个service,服务端的编写工作就算结束了

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.aidl.seer.serveraidl"><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/AppTheme"><activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><service android:name=".RemoteService">android:process=":remote"<intent-filter><action android:name="com.aidl.seer.serveraidl.CalculateInterface"></action></intent-filter></service></application></manifest>

接下来开始写客户端,打开Client工程,文件目录调成Project,将Server工程中的aidl文件夹整个复制粘贴到同样的目录下,这个地方必须一模一样,否则客户端将无法找到服务端提供的服务,这个工作一定要在Project目录结构下做,在Android目录结构下,天知道粘贴到哪儿去了。完成后最好把工程给Rebuild一下。

之后开始写Activity,在Acitivity中调用Server提供的实现加减乘除计算的函数,计算结果通过日志查看

import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.EditText;import com.example.a59129.server.CaculateInterface;public class ClientActivity extends AppCompatActivity {private CaculateInterface calculateInterface;@Overridepublic void setFinishOnTouchOutside(boolean finish) {super.setFinishOnTouchOutside(finish);}private ServiceConnection connection = new ServiceConnection() {@Overridepublic void onServiceConnected(ComponentName componentName, IBinder iBinder) {calculateInterface = CaculateInterface.Stub.asInterface(iBinder);try {//调用计算服务,进行计算double a = calculateInterface.add(1, 3);double b = calculateInterface.subtract(3, 5);double c = calculateInterface.multiply(2, 3);double d = calculateInterface.divide(4, 2);Log.e("加法", "the result is " + a);Log.e("减法", "the result is " + b);Log.e("乘法", "the result is " + c);Log.e("除法", "the result is " + d);} catch (RemoteException e) {e.printStackTrace();}} //onServiceConnected()@Overridepublic void onServiceDisconnected(ComponentName componentName) {calculateInterface = null;} //onServiceDisconnected()};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_client);Intent intent = new Intent();intent.setAction("com.example.a59129.server.CalculateInterface.AIDL");intent.setPackage("com.example.a59129.server");bindService(intent, connection, BIND_AUTO_CREATE);} //onCreate()@Overrideprotected void onDestroy() {super.onDestroy();unbindService(connection);} //onDestroy()}

这样一来服务端和客户端的工程就都完成了

我们先把Server运行起来:

然后运行Client,可以发现已经可以正确计算出结果:

简单的aidl的使用就完成了!

android的AIDL的调用相关推荐

  1. 简单音乐播放实例的实现,Android Service AIDL 远程调用服务

    2019独角兽企业重金招聘Python工程师标准>>> Android Service是分为两种: 本地服务(Local Service): 同一个apk内被调用 远程服务(Remo ...

  2. Android Service AIDL 远程调用服务 【简单音乐播放实例】

    Android Service是分为两种: 本地服务(Local Service): 同一个apk内被调用 远程服务(Remote Service):被另一个apk调用 远程服务需要借助AIDL来完成 ...

  3. Android深入源代码分析理解Aidl总体调用流程(雷惊风)

    2017年開始上班的第一天.老不想工作了,假期感觉还没開始就已经结束了,唉,时间就是这样,新的一年開始了,尽管非常不想干正事,没办法,必须干起来.由于后边的路还非常长,距离六十岁还非常远. 刚上班也没 ...

  4. aidl远程服务调用Android,报错:Process 'command 'F:\Android\SDK\build-tools\29.0.0\aidl.exe''

    aidl远程服务调用Android demo1: Alipay 支付App服务: 1.新建: Alipay\app\src\main\aidl\com\glsite\alipay\IAlipaySer ...

  5. android aidl工具,【Android】AIDL介绍和实例讲解

    前言 为使应用程序之间能够彼此通信,Android提供了IPC (Inter Process Communication,进程间通信)的一种独特实现: AIDL (Android Interface ...

  6. Android 进程间通信——AIDL

    代码地址如下: http://www.demodashi.com/demo/12321.html 原文地址:http://blog.csdn.net/vnanyesheshou/article/det ...

  7. android 自动生成aidl,[Android]用AIDL生成Service

    对于用aidl生成Service,之前作过,这里记录一下,顺便也整理一下思路.java 一.建立aidl文件.android 这个aidl文件必须包括包名,和用interface的形式定义方法.ecl ...

  8. Android 电话的反射调用机制实现自动接听电话

    最近在看一些有关反射和aidl远程服务控制的类,自己也小写了这么一个Android 电话的反射调用机制实现静默接听电话demo 自己总结出来,以供查阅,若是还有其他问题,希望大家指出. 首先要调用系统 ...

  9. Android通过AIDL实现接听电话、挂断电话操作 | 拨打电话

    Android中拨打电话功能是很轻松的只需要几行代码即可,如下: 首先还是得加上权限这个东西(或者动态申请) <!--拨打电话--> <uses-permission android ...

最新文章

  1. 计算机什么时候学汇编,[计算机基础] 汇编学习(1)
  2. spring_在运行时更新代码(已Spring解密)
  3. 雷军:年轻人入职半年内不要提意见,不靠谱;微信表情新彩蛋遭疯狂吐槽:满屏“炸屎”;谷歌正式推出 Fuchsia OS|极客头条...
  4. 2015年10月26日作业
  5. 【书籍推荐】《美国黒室》
  6. 【通信】基于matlab FDTD法研究移动通信终端电磁辐射对人体的影响【含Matlab源码 761期】
  7. android nsd和udp广播,android - 调用resolveService时,NSD在DiscoveryListener回调中缺少NSDManager - 堆栈内存溢出...
  8. 微信小程序demo(新闻类)
  9. asp.net助学贷款管理系统案例
  10. java加锁_JAVA最好的加锁方法是什么
  11. mysql 表分区 排序_mysql 表分区
  12. 预告 | 互联网人吐槽大会系列漫画 要来啦~
  13. GFLOPS、GFLOPs 和 GMACs的区别与关系
  14. 高级过程控制传热自动化实训装置
  15. 12.03-内存管理_Tagged Pointer
  16. latexstudio编译报错问题:无法启动buildview:Xelatex:xelatex.exe -synctex=1 -interacion=nonstopmode
  17. java 取一个整数a从右端开始的4~7位。
  18. Eclipse ADT中的logcat不显示解决方法
  19. Photoshop-字体应用
  20. 2019最新《传智黑马39期WEB前端开发全套项目实战》

热门文章

  1. 【Java并发编程】16、ReentrantReadWriteLock源码分析
  2. 事件冒泡与事件捕获,附实例
  3. EularProject 39:给周长推断构成直角三角形个数
  4. 我的编程之路(二十五) 上海的老同学
  5. Android 中文API (68) —— BluetoothClass.Service
  6. Project testing plan
  7. 辐流式重力浓缩池计算_注册考试重点!平流式、竖流式、辐流式、斜板式4大沉淀池构型...
  8. 只安装oracle服务端连plsql,Oracle 不安装Oracle客户端,使用PLSQL连接Oracle服务器
  9. smallint占用几个字节_面试官问我:Object o = new Object() 占用了多少个字节?
  10. linux 查看安装的系统版本,linux之查看版本信息命令