项目简介

我们要实现一个计算器的功能。
首先实现一个服务端,用于提供计算服务,供客户端去调用。它接受客户端提供的两个值,计算之后,返回两个数之和。

第二,实现客户端界面进行操作。

第三: 我们命名客户端和服务端。

第四:定义AIDL,连接客户端与服务端。

程序代码

程序实例代码

实现服务端

1. 定义aidl接口

我们接着上篇文章AIDL使用详解 (二)AndroidStudio中 创建 AIDL service继续,根据上篇文章创建aidl文件的步骤创建。然后修改代码:

// IMyAidlInterface.aidl
package com.kite.aidltest;// Declare any non-default types here with import statementsinterface IMyAidlInterface {//计算两个数之和int add(int num1, int num2);
}

修改之后,编译一下,Build ->make project.

根据官方文档:

2. 实现接口

我们定义好adil文件后,然后实现该接口。接下来创建一个service去实现服务端。

package com.kite.aidltest;import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;public class RemoteService extends Service {private static final String TAG = "RemoteService";public RemoteService() {}/*** 当客户端绑定该服务时 会执行以下代码,返回iBInder对象* @param intent* @return*/@Overridepublic IBinder onBind(Intent intent) {return iBinder;}private IBinder iBinder = new IMyAidlInterface.Stub() {@Overridepublic int add(int num1, int num2) throws RemoteException {Log.d(TAG, "add方法:收到了客户端的请求 ,输入的" +"num1 ->" + num1 + "\n num2 ->" + num2);return num1 + num2;}};
}

3. 向客户端公开该接口

这也是实现客户端的步骤,请见实现客户端

实现客户端

新建aidl client 模块

新建一个aidl client 模块。详细步骤如图:

创建界面

修改该模块的activity_main 资源文件。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main"android:layout_width="match_parent" android:layout_height="match_parent"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"android:orientation="vertical"tools:context="com.kite.aidlclient.MainActivity"><EditText
       android:id="@+id/num1"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="#ececec"/><TextView
        android:id="@+id/add"android:layout_width="match_parent"android:layout_height="wrap_content"android:textSize="25sp"android:text="+" /><EditText
        android:id="@+id/num2"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="#ececec"/><TextView
        android:id="@+id/value"android:layout_width="match_parent"android:layout_height="wrap_content"android:textSize="25sp"android:text="=" /><EditText
        android:id="@+id/result"android:inputType="none"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="#eceaea"/><Button
        android:id="@+id/toAdd"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:text="哆啦A梦超能力(计算)"/>
</LinearLayout>

注意:客户端和服务端的adil文件必须一致(包名也必须一致),所以复制服务端的adil文件到adilclient中,然后编译程序。
然后修改 MainActivity

package com.kite.aidlclient;import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.os.RemoteException;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;import com.kite.aidltest.IMyAidlInterface;public class MainActivity extends AppCompatActivity implements View.OnClickListener {private static final String TAG = "MainActivity";private EditText num1;private EditText num2;private EditText result;private Button toAdd;IMyAidlInterface iMyAidlInterface;private ServiceConnection conn = new ServiceConnection() {//绑定上服务的时候@Overridepublic void onServiceConnected(ComponentName componentName, IBinder iBinder) {//接受到了远程的服务Log.d(TAG, "onServiceConnected: ");iMyAidlInterface = IMyAidlInterface.Stub.asInterface(iBinder);}// 当服务断开的时候调用@Overridepublic void onServiceDisconnected(ComponentName componentName) {Log.d(TAG, "onServiceDisconnected: ");//回收资源iMyAidlInterface = null;}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();bindServce();}private void initView() {num1 = (EditText) findViewById(R.id.num1);num2 = (EditText) findViewById(R.id.num2);result = (EditText) findViewById(R.id.result);toAdd = (Button) findViewById(R.id.toAdd);toAdd.setOnClickListener(this);}@Overridepublic void onClick(View view) {int number1 = Integer.valueOf(num1.getText().toString());int number2 = Integer.valueOf(num2.getText().toString());try {//调用远程服务int valueRes = iMyAidlInterface.add(number1, number2);result.setText(valueRes + "");} catch (RemoteException e) {e.printStackTrace();result.setText("error");}}private void bindServce() {//获取到服务端, 5.0 之后必须显示绑定服务Intent intent = new Intent();intent.setComponent(new ComponentName("com.kite.aidltest", "com.kite.aidltest.RemoteService"));bindService(intent, conn, BIND_AUTO_CREATE);Log.d(TAG, "bindServce: bind on end");}@Overrideprotected void onDestroy() {super.onDestroy();unbindService(conn);}
}

注意事项

  1. 每次修改aidl文件都要编译一下程序。
  2. 两个模块都要安装在手机中,并且打开。这样才能调用服务端。

AIDL使用详解(三) 客户端通过AIDL与服务端通信 实例项目相关推荐

  1. SSO单点登录详解-------八、搭建CAS Client服务端

    一.前言 目前为止我们已经搭建好了CAS Server端,我们需要来搭建客户端配合使用,完成单点登录和单点注销的功能.我们将讲两种方式来搭建CAS Client端.一种是普通项目搭建,另一种是基于Sp ...

  2. java与c++ socket通信_C++ socket 客户端与JAVA socket 服务端通信汗血宝马

    C++ socket 连接java 服务如果发送 packHeadLength+消息体 java 客户端代码 Socket socket = new Socket("127.0.0.1&qu ...

  3. SSH 服务详解 (三)-- 使用 SSH 代理

    SSH 服务详解 (三)-- 使用 SSH 代理 SSH服务详解(一)–Linux SSH 服务器与客户端的安装与启动 SSH服务详解(二)–使用私钥登录 SSH 服务器(免密登录) SSH 服务详解 ...

  4. Android AIDL使用详解

    一.概述 AIDL 意思即 Android Interface Definition Language,翻译过来就是Android接口定义语言,是用于定义服务器和客户端通信接口的一种描述语言,可以拿来 ...

  5. Android进阶——AIDL详解之使用远程服务AIDL实现进程间带远程回调接口和自定义Bean的较复杂通信小结(二)

    文章大纲 引言 一.远程回调AIDL接口的应用 1.封装基本的父类和一些工具类 2. 创建服务端的AIDL 2.1.定义回调AIDL接口 2.2.定义业务AIDL接口 3.实现服务端对应AIDL的带有 ...

  6. Android之AIDL使用详解

    1.什么是aidl:aidl是 Android Interface definition language的缩写,一看就明白,它是一种android内部进程通信接口的描述语言,通过它我们可以定义进程间 ...

  7. Windows 7防火墙设置详解(三)

    Windows 7防火墙设置详解(三) 一.如何禁用或启用规则 方法:只需要在需要禁用或启动的规则上,鼠标右键选择启用或禁止规则即可,或点击右侧的操作栏进行规则启用或禁止. 二.入站规则和出站规则 由 ...

  8. 【高级篇】详解Zookeeper客户端Curator

    一.序言 之前分享过一篇关于Curotor的基本应用[基础篇]详解Zookeeper客户端Curator,如果对Curator没有了解的可以看看,本文分享关于Curator的一些高级特性,在监听和le ...

  9. MQTT协议详解 三、MQTT控制包(CONNECT)

    文章目录 系列文章目录 前言 CONNECT(客户端请求连接服务端) 一.固定包头(2字节) 二.可变包头(10字节) 协议名字(6字节) 协议等级(1字节) 连接标识(1字节) Clean Sess ...

最新文章

  1. 由防重复点击引发的幂等性问题思考
  2. .NET Core微服务开发选项
  3. Lync Server 2013企业版部署系列之三:CA准备
  4. Python机器学习:贝叶斯文本分类器
  5. vue实现点击高亮效果_vue结合Echarts实现点击高亮效果的示例
  6. COGS 2687 讨厌整除的小明
  7. 大学计算机一级等级考试题,大学计算机一级考试试题.doc
  8. AiTrust下预训练和小样本学习在中文医疗信息处理挑战榜CBLUE表现
  9. java中的打印pdf_Java 打印PDF文档
  10. 将列表类型的数据转换为树形数据
  11. android动态权限依赖库,动态申请app权限:郭霖大神的PermissionX库带你告别原生
  12. linkerd1.6 local安装方式文档
  13. 个性化推荐系统设计(3.1)——如何评价个性化推荐系统的效果
  14. OpenCL 学习step by step (11) 数组求和(reduction)
  15. 值得加入的“小而美”公司,2020最佳Tech创业公司盘点
  16. 关于印发《黑龙江省农村土地承包经营权确权登记试点工作操作规程(试行)》的通知
  17. (语法糖)ES6类class声明类的方式 -ES5类声明继承
  18. 用一封邮箱定位对方的位置
  19. 【Jquery手风琴】
  20. 既然MAC地址是唯一的,为什么还需要IP地址?

热门文章

  1. 【shell】万能解压脚本
  2. 在windows下解压压缩文件时出现文件名重名的问题
  3. Word自动化排版画图,Python还能这么玩?
  4. 深入MySQL字符编码与对照规则
  5. win11和win10哪个好?
  6. 制造业企业erp软件测试工作,浅谈制造业ERP项目的验收测试
  7. C语言(基础)给定一个字母N,输出一个字母三角形,输入一个整数n,n大于0小于等于26,表示字母三角形的层数
  8. 诺基亚n8和n9java_诺基亚N9和诺基亚800哪个好
  9. 黑客真实生活复现 | 十部超赞黑客电影,周末肥宅生活必备!
  10. 大连新成立日本独资企业招聘测试相关职位(PM GL)