AIDL使用详解(三) 客户端通过AIDL与服务端通信 实例项目
项目简介
我们要实现一个计算器的功能。
首先实现一个服务端,用于提供计算服务,供客户端去调用。它接受客户端提供的两个值,计算之后,返回两个数之和。
第二,实现客户端界面进行操作。
第三: 我们命名客户端和服务端。
第四:定义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);}
}
注意事项
- 每次修改aidl文件都要编译一下程序。
- 两个模块都要安装在手机中,并且打开。这样才能调用服务端。
AIDL使用详解(三) 客户端通过AIDL与服务端通信 实例项目相关推荐
- SSO单点登录详解-------八、搭建CAS Client服务端
一.前言 目前为止我们已经搭建好了CAS Server端,我们需要来搭建客户端配合使用,完成单点登录和单点注销的功能.我们将讲两种方式来搭建CAS Client端.一种是普通项目搭建,另一种是基于Sp ...
- java与c++ socket通信_C++ socket 客户端与JAVA socket 服务端通信汗血宝马
C++ socket 连接java 服务如果发送 packHeadLength+消息体 java 客户端代码 Socket socket = new Socket("127.0.0.1&qu ...
- SSH 服务详解 (三)-- 使用 SSH 代理
SSH 服务详解 (三)-- 使用 SSH 代理 SSH服务详解(一)–Linux SSH 服务器与客户端的安装与启动 SSH服务详解(二)–使用私钥登录 SSH 服务器(免密登录) SSH 服务详解 ...
- Android AIDL使用详解
一.概述 AIDL 意思即 Android Interface Definition Language,翻译过来就是Android接口定义语言,是用于定义服务器和客户端通信接口的一种描述语言,可以拿来 ...
- Android进阶——AIDL详解之使用远程服务AIDL实现进程间带远程回调接口和自定义Bean的较复杂通信小结(二)
文章大纲 引言 一.远程回调AIDL接口的应用 1.封装基本的父类和一些工具类 2. 创建服务端的AIDL 2.1.定义回调AIDL接口 2.2.定义业务AIDL接口 3.实现服务端对应AIDL的带有 ...
- Android之AIDL使用详解
1.什么是aidl:aidl是 Android Interface definition language的缩写,一看就明白,它是一种android内部进程通信接口的描述语言,通过它我们可以定义进程间 ...
- Windows 7防火墙设置详解(三)
Windows 7防火墙设置详解(三) 一.如何禁用或启用规则 方法:只需要在需要禁用或启动的规则上,鼠标右键选择启用或禁止规则即可,或点击右侧的操作栏进行规则启用或禁止. 二.入站规则和出站规则 由 ...
- 【高级篇】详解Zookeeper客户端Curator
一.序言 之前分享过一篇关于Curotor的基本应用[基础篇]详解Zookeeper客户端Curator,如果对Curator没有了解的可以看看,本文分享关于Curator的一些高级特性,在监听和le ...
- MQTT协议详解 三、MQTT控制包(CONNECT)
文章目录 系列文章目录 前言 CONNECT(客户端请求连接服务端) 一.固定包头(2字节) 二.可变包头(10字节) 协议名字(6字节) 协议等级(1字节) 连接标识(1字节) Clean Sess ...
最新文章
- 由防重复点击引发的幂等性问题思考
- .NET Core微服务开发选项
- Lync Server 2013企业版部署系列之三:CA准备
- Python机器学习:贝叶斯文本分类器
- vue实现点击高亮效果_vue结合Echarts实现点击高亮效果的示例
- COGS 2687 讨厌整除的小明
- 大学计算机一级等级考试题,大学计算机一级考试试题.doc
- AiTrust下预训练和小样本学习在中文医疗信息处理挑战榜CBLUE表现
- java中的打印pdf_Java 打印PDF文档
- 将列表类型的数据转换为树形数据
- android动态权限依赖库,动态申请app权限:郭霖大神的PermissionX库带你告别原生
- linkerd1.6 local安装方式文档
- 个性化推荐系统设计(3.1)——如何评价个性化推荐系统的效果
- OpenCL 学习step by step (11) 数组求和(reduction)
- 值得加入的“小而美”公司,2020最佳Tech创业公司盘点
- 关于印发《黑龙江省农村土地承包经营权确权登记试点工作操作规程(试行)》的通知
- (语法糖)ES6类class声明类的方式 -ES5类声明继承
- 用一封邮箱定位对方的位置
- 【Jquery手风琴】
- 既然MAC地址是唯一的,为什么还需要IP地址?