前言

该篇文件讲述的是AIDL最基本的使用(创建、调用),关于对于AIDL更深的认识,在后续的随笔中,会持续与大家分享并探讨。

正文

  • AIDL的定义(什么是AIDL?)
  • AIDL的应用场景(AIDL可以做什么?)
  • 如何写一个AIDL的应用?(代码)

AIDL概述(定义)

  • AIDL:Android Interface Definition Language,即Android接口定义语言。也就是说:AIDL也是一种语言。
  • 设计AIDL语言的目的:为了实现进程间通信。

    本篇文章主要介绍的是AIDL的代码实现。关于进程间通信的分析,小伙伴们可以参考:浅谈应用进程间的通信(AIDL和IPC)

AIDL应用场景

  • 如:某个应用调用支付宝的支付功能、微信的支付功能

写一个AIDL的应用 AIDL模板代码

  1. *与你一步步掌握AIDL的应用*

需求

  • 应用A:模拟一个商城应用(如:拼XX)
  • 应用B:模拟一个支付应用(如:支付宝),应用中有一个支付服务在运行,服务中定义了一个带返回值的支付方法。
  • 要求:在应用A中,调用应用B支付服务中的支付方法,传一个参数并获取返回值。

代码实现

应用B:被调用方

    1. 创建一个service:AliPayService,并在清单文件中配置信息
  • AndroidManifest.xml

  1. <!--调用远程服务,需要通过bind方式启动服务,调用服务方法-->
  2. <service android:name=".service.pay.AliPayService">
  3. <intent-filter>
  4. <action android:name="com.zero.notes.service.pay.xxx"/>
  5. </intent-filter>
  6. </service>
  • AliPayService
  1. import android.app.Service;
  2. import android.content.Intent;
  3. import android.os.Handler;
  4. import android.os.IBinder;
  5. import android.os.Message;
  6. import android.util.Log;
  7. import android.widget.Toast;
  8. /**
  9. * 模拟:阿里支付服务
  10. */
  11. public class AliPayService extends Service {
  12. @Override
  13. public IBinder onBind(Intent intent) {
  14. return new MyBinder();
  15. }
  16. //模拟支付方法
  17. public boolean aliPay(int money) {
  18. Log.e("AIDL", "服务线程:" + Thread.currentThread().getName());
  19. if (money > 100) {
  20. handler.sendEmptyMessage(1);
  21. return true;
  22. } else {
  23. handler.sendEmptyMessage(0);
  24. return false;
  25. }
  26. }
  27. // class MyBinder extends Binder implements IPayservice {
  28. // @Override
  29. // public boolean callAliPay(int money) throws RemoteException {
  30. // return aliPay(money);
  31. // }
  32. // @Override
  33. // public IBinder asBinder() {
  34. // return null;
  35. // }
  36. // }
  37. /**
  38. * 创建中间人对象(中间帮助类)
  39. */
  40. class MyBinder extends IPayservice.Stub {
  41. @Override
  42. public boolean callAliPay(int money) {
  43. return aliPay(money);
  44. }
  45. }
  46. private Handler handler = new Handler() {
  47. @Override
  48. public void handleMessage(Message msg) {
  49. super.handleMessage(msg);
  50. if (msg.what == 1) {
  51. Toast.makeText(getApplicationContext(), "土豪,购买成功...", Toast.LENGTH_SHORT).show();
  52. } else {
  53. Toast.makeText(getApplicationContext(), "钱太少啦,购买失败...", Toast.LENGTH_SHORT).show();
  54. }
  55. }
  56. };
  57. }
  • IPayservice.aidl

    此处需要注意:创建的 IPayservice.aidl 文件是一个接口文件。Android Studio上可以直接创建一个AIDL文件。创建完成后,切记:把整个项目clean一下,让代码编辑器生成一些必要的文件信息。(Android Studio项目clean方式:Build -> Clean Project)
  1. // IPayservice.aidl
  2. package com.zero.notes.service.pay;
  3. // Declare any non-default types here with import statements
  4. interface IPayservice {
  5. boolean callAliPay(int money);
  6. }
  • MainActivity

    应用B启动该服务(代码书写:kotlin语言)
  1. class MainActivity : BaseActivity() {
  2. override fun onCreate(savedInstanceState: Bundle?) {
  3. super.onCreate(savedInstanceState)
  4. setContentView(R.layout.activity_main)
  5. initData()
  6. }
  7. private fun initData() {
  8. val intent = Intent(this,AliPayService::class.java)
  9. startService(intent)
  10. }
  11. }

应用A:调用方(书写代码:Kotlin语言)

  • 拷贝:把应用B 中的 IPayservice.aidl 文件拷贝到应用A内

    切记::拷贝的时候,IPayservice.aidl 的路径位置必须与应用B中保持完全一致,包名、路径名要完全一致!

    如图所示:图1️⃣是以Android方式查看;图2️⃣是以Project方式查看。

  • 创建服务连接对象
  1. //创建一个服务连接对象
  2. class MyServiceConnection : ServiceConnection {
  3. private lateinit var iPayService: IPayservice
  4. override fun onServiceDisconnected(name: ComponentName?) {
  5. }
  6. override fun onServiceConnected(name: ComponentName?, service: IBinder?) {
  7. //2. 获取中间人对象(服务绑定成功后会返回一个中间人对象)
  8. iPayService = IPayservice.Stub.asInterface(service)
  9. }
  10. //获取中间人对象
  11. fun getIPayService():IPayservice{
  12. return iPayService
  13. }
  14. }
  • 在应用A 的 Activity 中调用服务方法
  1. class MainActivity : AppCompatActivity() {
  2. private var connection: MyServiceConnection? = null
  3. override fun onCreate(savedInstanceState: Bundle?) {
  4. super.onCreate(savedInstanceState)
  5. setContentView(R.layout.activity_main)
  6. val intent = Intent()
  7. intent.action = "com.zero.notes.service.pay.xxx"
  8. intent.setPackage("com.zero.notes")
  9. connection = MyServiceConnection()
  10. bindService(intent, connection, Context.BIND_AUTO_CREATE)
  11. tvJump.setOnClickListener {
  12. val iPayService = connection?.getIPayService()
  13. val pay = iPayService?.callAliPay(1000)!!
  14. if (pay) {
  15. //购买成功
  16. } else {
  17. //购买失败
  18. }
  19. }
  20. }
  21. override fun onDestroy() {
  22. super.onDestroy()
  23. if (connection != null) {
  24. unbindService(connection)
  25. connection = null
  26. }
  27. }
  28. }
  • 应用A:Activity的xml文件
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout
  3. xmlns:android="http://schemas.android.com/apk/res/android"
  4. android:layout_width="match_parent"
  5. android:gravity="center_horizontal"
  6. android:layout_height="match_parent"
  7. android:orientation="vertical">
  8. <TextView
  9. android:id="@+id/tvJump"
  10. android:layout_width="wrap_content"
  11. android:layout_marginTop="30dp"
  12. android:text="AIDL调用方法"
  13. android:textColor="#FF212121"
  14. android:textSize="20sp"
  15. android:padding="16dp"
  16. android:background="#66000000"
  17. android:textStyle="bold"
  18. android:layout_height="wrap_content"/>
  19. </LinearLayout>

让我们一起学习如何使用AIDL,它其实并不难(Android)的更多相关文章

  1. Linux学习心得之 Linux下命令行Android开发环境的搭建

    作者:枫雪庭 出处:http://www.cnblogs.com/FengXueTing-px/ 欢迎转载 Linux学习心得之 Linux下命令行Android开发环境的搭建 1. 前言2. Jav ...

  2. Android开发学习总结(一)——搭建最新版本的Android开发环境

    Android开发学习总结(一)——搭建最新版本的Android开发环境(转) 最近由于工作中要负责开发一款Android的App,之前都是做JavaWeb的开发,Android开发虽然有所了解,但是 ...

  3. Flutter学习(9)——Flutter插件实现(Flutter调用Android原生

    原文地址: Flutter学习(9)--Flutter插件实现(Flutter调用Android原生) | Stars-One的杂货小窝 最近需要给一个Flutter项目加个apk完整性检测,需要去拿 ...

  4. 【转】Android开发学习总结(一)——搭建最新版本的Android开发环境

    最近由于工作中要负责开发一款Android的App,之前都是做JavaWeb的开发,Android开发虽然有所了解,但是一直没有搭建开发环境去学习,Android的更新速度比较快了,Android1. ...

  5. 【转】Pro Android学习笔记(四):了解Android资源(下)

    处理任意的XML文件 自定义的xml文件放置在res/xml/下,可以通过R.xml.file_name来获取一个XMLResourceParser对象.下面是xml文件的例子: <rootna ...

  6. 【转】Pro Android学习笔记(三):了解Android资源(上)

    在Android开发中,资源包括文件或者值,它们和执行应用捆绑,无需在源代码中写死,因此我们可以改变或替换他们,而无需对应用重新编译. 了解资源构成 参考阅读Android学习笔记(三八):资源res ...

  7. Cocos2d-x 3.1.1 学习日志12--一Cocos2dx3.1.1移植到Android平台的方法(最实用最有效的!!)

    须要用到工具(依照顺序): 1.JDK 2.NDK 3.ANT 4.Adt-bundle-windows 将JDK文件夹下的bin文件夹路径加入到系统环境变量中. 解压NDK 解压Adt-bundle ...

  8. Android学习总结(1)——好的 Android 开发习惯

    Android编码规范 java代码中不出现中文,最多注释中可以出现中文: 局部变量命名.静态成员变量命名:只能包含字母,单词首字母出第一个都为大写,其他字母都为小写: 常量命名:只能包含字母和 ,字 ...

  9. Android开发学习---使用Intelij idea 13.1 进行android 开发

    1.为什么放弃eclipse?太卡!! 实在受不了eclipse的卡了,运行WEB项目还好,但android开发实在太慢,太慢!经常卡死,CPU经常被占满! 看网上很多人都说比Intelij idea ...

随机推荐

  1. 第 10 篇:小细节 Markdown 文章自动生成目录,提升阅读体验

    目录 在文中插入目录 在页面的任何地方插入目录 处理空目录 美化标题的锚点 URL 作者:HelloGitHub-追梦人物 文中涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库 上 ...

  2. Linux环境搭建 | 手把手教你安装Linux虚拟机

    前言 作为一名Linux工程师,不管是运维.应用.驱动方向,在工作中肯定会需要Linux环境.想要获得Linux环境,一个办法就是将电脑系统直接换成Linux系统,但我们平常用惯了Windows系统, ...

  3. 安装tomcat出现的问题

    今天在安装tomcat时出现了配置环境不对的问题. 在正确配置Tomcat环境变量后,遇到很多次运行startup.bat后,一个窗口一闪而过的. 解决方法: 1.在tomcat的目录下选中start ...

  4. CocosBuilder 学习笔记(3) AnimationManager 与 ccbi 文件解析

    [CocosBuilder]学习笔记目录 1. 相关的类 先介绍和AnimationManager相关的几个类: CCBSequence 时间线.有成员duration(时间线时间,默认10秒).na ...

  5. Spring Boot 2.0 教程 | 快速集成整合消息中间件 Kafka

    欢迎关注个人微信公众号: 小哈学Java, 每日推送 Java 领域干货文章,关注即免费无套路附送 100G 海量学习.面试资源哟!! 个人网站: https://www.exception.site ...

  6. FastDFS初印象

    是什么?         FastDFS是一个轻量级分布式文件系统. 能干嘛?         对文件进行管理,功能包括:文件存储.文件同步.文件访问(文件上传.文件下载)等. 相关概念        ...

  7. 爬虫——网页解析利器--re & xpath

    正则解析模块re re模块使用流程 方法一 r_list=re.findall('正则表达式',html,re.S) 方法二  创建正则编译对象 pattern = re.compile('正则表达式 ...

  8. CF1025B Weakened Common Divisor 数学

    Weakened Common Divisor time limit per test 1.5 seconds memory limit per test 256 megabytes input st ...

  9. WebGL2系列之采样器对象

    前言 在WebGL1中,纹理的图片和采样信息都是写在纹理对象之中. 采样信息告诉GPU如何去读取贴图上图片的信息. 如果我们希望从同一个图片多次读取像素信息,但是每次读取的时候使用的过滤方式不一样, ...

  10. Fiddler 手机爬虫

    Fiddler抓包工具 配置Fiddler 添加证书信任,Tools - Options - HTTPS,勾选 Decrypt Https Traffic 后弹出窗口,一路确认 ...from bro ...