Android - AIDL 使用
AIDL(Android Interface Definition Language)
程序员可以利用AIDL自定义编程接口,在客户端和服务端之间实现进程间通信(IPC)。在Android平台上,一个进程通常不能访问另外一个进程的内存空间,因此,Android平台将这些跨进程访问的对象分解成操作系统能够识别的简单对象。并为跨应用访问而特殊编排和整理这些对象。用于编排和整理这些对象的代码编写起来十分冗长,所以Android的AIDL提供了相关工具来自动生成这些代码。
例子:创建两个apk,一个作为服务提供方,一个作为AIDL服务调用方。
android studio
AIDL服务方代码
一共4步
1.先进入服务方的工程,在com.rust.aidl包内创建IMyService.aidl文件
// IMyService.aidl
package com.rust.aidl;
// Declare any non-default types here with import statements
interface IMyService {
/**
* Demonstrates some basic types that you can use as parameters
* and return values in AIDL.
*/
void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,
double aDouble, String aString);
String helloAndroidAIDL(String name);// 此次使用的方法
}
2.在com.rust.service包内创建MyService.java文件;有一个内部类MyServiceImpl实现接口的功能
package com.rust.service;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
import android.support.annotation.Nullable;
import android.util.Log;
import com.rust.aidl.IMyService;
public class MyService extends Service {
public class MyServiceImpl extends IMyService.Stub {
@Override
public void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,
double aDouble, String aString) throws RemoteException {
}
public String helloAndroidAIDL(String name) throws RemoteException {
Log.d("aidl", "helloAndroidAIDL heard from : " + name);
return "Rust: Service01 return value successfully!";
}
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return new MyServiceImpl();// 返回内部类实例
}
}
3.实现了MyService类后,对此AIDL服务进行配置;在AndroidManifest.xml文件中配置
<service android:name="com.rust.service.MyService">
<intent-filter>
<action android:name="com.rust.aidl.IMyService" />
</intent-filter>
</service>
service写实现类MyService;action里面写上AIDL文件
4.发布运行此apk
AIDL调用方代码
建立(或进入)AIDL调用方的工程,这里是MyAIDLTest工程。有如下3个步骤:
1.将AIDL服务端生成的Java文件复制到调用方工程里,尽量保持这个Java文件的路径与服务端的一致,便于识别
2.写代码绑定服务,获取AIDL服务对象
3.通过AIDL服务对象完成AIDL接口调用
本例中,生成的Java文件路径为:服务端/app/build/generated/source/aidl/debug/com/rust/aidl/IMyService.java
将其复制到调用方工程下:MyAIDLTest/app/src/main/java/com/rust/aidl/IMyService.java
编写调用方MainActivity.java代码
package rust.myaidltest;
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.view.View;
import android.widget.Button;
import android.widget.Toast;
import com.rust.aidl.IMyService;
public class MainActivity extends AppCompatActivity {
Button aidlBtn;
IMyService myService;// 服务
String appName = "unknown";
private ServiceConnection serviceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
myService = IMyService.Stub.asInterface(service);// 获取服务对象
aidlBtn.setEnabled(true);
}// 连接服务
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
aidlBtn = (Button) findViewById(R.id.aidl_1_btn);
appName = getPackageName();
// 我们没办法在构造Intent的时候就显式声明.
Intent intent = new Intent("com.rust.aidl.IMyService");
// 既然没有办法构建有效的component,那么给它设置一个包名也可以生效的
intent.setPackage("com.rust.aboutview");// the service package
// 绑定服务,可设置或触发一些特定的事件
bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);
aidlBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
// AIDL服务调用代码如下:
String msg = myService.helloAndroidAIDL(appName);
Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_SHORT).show();
} catch (RemoteException e) {
e.printStackTrace();
}
}
});
}
}
效果
点击调用端的按钮,弹出Toast:Rust: Service01 return value successfully!
服务端apk打印log:helloAndroidAIDL heard from : rust.myaidltest
其中,rust.myaidltest就是调用端传入的自身的包名
服务端更新后,如果aidl文件没改动,不需要更新生成的Java文件
如果服务端apk被卸载,调用端使用此服务时会出错
Android - AIDL 使用的更多相关文章
- Android AIDL自动生成Java文件测试
/******************************************************************************** * Android AIDL自动生成 ...
- Using self-defined Parcelable objects during an Android AIDL RPC / IPC call
Using self-defined Parcelable objects during an Android AIDL RPC / IPC call In my previous post “Usi ...
- AIDL/IPC Android AIDL/IPC 进程通信机制——超具体解说及使用方法案例剖析(播放器)
首先引申下AIDL.什么是AIDL呢?IPC? ------ Designing a Remote Interface Using AIDL 通常情况下,我们在同一进程内会使用Binder.Broad ...
- (转载)你真的理解Android AIDL中的in,out,inout么?
前言 这其实是一个很小的知识点,大部分人在使用AIDL的过程中也基本没有因为这个出现过错误,正因为它小,所以在大部分的网上关于AIDL的文章中,它都被忽视了——或者并没有,但所占篇幅甚小,且基本上都是 ...
- Android AIDL使用详解_Android IPC 机制详解
一.概述 AIDL 意思即 Android Interface Definition Language,翻译过来就是Android接口定义语言,是用于定义服务器和客户端通信接口的一种描述语言,可以拿来 ...
- android aidl
参考: http://blog.csdn.net/u014614038/article/details/48399935 本文提供了一个关于AIDL使用的简单易懂的例子,分为客户端和服务端两部分,分别 ...
- android aidl 进程间通信需要注意的地方(android.os.TransactionTooLargeException)
转自:http://blog.sina.com.cn/s/blog_4e1e357d0102wau9.html 1.bus工程实现通过service实现aidl实体类 2.actor工程通过发起bin ...
- Android AIDL 进行进程间通讯(IPC)
编写AIDL文件时,需要注意: 1.接口名和aidl文件名相同. 2.接口和方法前不用加访问权限修饰符 (public.private.protected等,也不能用final.static). 3. ...
- Android aidl Binder框架浅析
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38461079 ,本文出自[张鸿洋的博客] 1.概述 Binder能干什么?B ...
- Android AIDL使用详解
1.什么是aidl:aidl是 Android Interface definition language的缩写,一看就明白,它是一种android内部进程通信接口的描述语言,通过它我们可以定义进程间 ...
随机推荐
- Ionic3新特性--页面懒加载1
Ionic3新的懒加载机制给我带来了如下新特性: 避免在每一个使用到某Page的Module或其他Page中重复的import这个类(需要写一堆路径) 允许我们通过字符串key在任何想使用的地方获取某 ...
- maven无法加载本地jar包以及maven项目打包后本地jar包没有打进项目的问题解决办法
1.首先设置依赖项,这样maven就会把该路径下的jar包导入项目引用 <dependency> <groupId>DPSDK-Manager</groupId> ...
- selenium+python元素操作
1.判断元素的属性if i.get_attribute('type') == 'checkbox' 2.获取当前窗口的坐标 driver.get_window_position 获取当前窗口的长宽 d ...
- python制作pdf电子书
python制作pdf电子书 准备 制作电子书使用的是python的pdfkit这个库,pdfkit是 wkhtmltopdf 的Python封装包,因此在安装这个之前要安装wkhtmltopdf 安 ...
- 行内元素和块级元素的具体区别是什么?行内元素的padding和margin可设置吗?
块级元素(block)特性: 总是独占一行,表现为另起一行开始,而且其后的元素也必须另起一行显示; 宽度(width).高度(height).内边距(padding)和外边距(margin)都可控制; ...
- webpack的简单配置
本人刚开始也不会写webpack配置,刚开始在网上搜索了了一些,看的也是刚刚理解,所以准备自己写下来,已作纪念和贡献给像我一样不会配置的“童鞋”们! 1.创建webpack配置文件 在项目文件下创建一 ...
- php通过curl扩展进行模拟登录(含验证码)
以下为本人工作中遇到的需要做的事情,之前也没怎么用过curl,查了好多资料,才稍微弄明白一点:本文所有内容只是自己平日工作的记录,仅供大家参考:<?php/*** 模拟登录*/header(&q ...
- 【Android Developers Training】 65. 应用投影和相机视图
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- JAVA基础——运算符和表达式
JAVA语言常用的运算符和表达式详解 一.简述 运算符是一种"功能"符号,用以通知 Java 进行相关的运算.譬如,我们需要将变量 age 的值设置为 20 ,这时候就需要一个&q ...
- flex sqlite基本用法
flex sqlite基本用法 页面 <?xml version="1.0" encoding="utf-8"?> <s:WindowedAp ...