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内部进程通信接口的描述语言,通过它我们可以定义进程间 ...
随机推荐
- 第41篇 推荐一个jekyll博客模板
本人用的模板是基于Codeboy的博客模板改造模板,(由于本人可能会有很多样式修改,所以不再将修改pullrequst到原项目,在此对codeboy模板表示感谢).功能改造如下: 添加微信支付宝打赏 ...
- 【锋利的jQuery】中全局事件ajaxStart、ajaxStop不执行
最近一直都在研究[锋利的jQuery],确实是一本好书,受益匪浅.但由于技术发展及版本更新等原因,里面还是有些坑需要踩的. 比如:第六章七节中提到的全局事件ajaxStart.ajaxStop照着案例 ...
- Cookie的作用以及封装的方法
Cookie相当于本地储存(local Storage),也是一种储存信息的方式. 它通过 document.cookie ='name=value' //name name值 value value ...
- CVE-2017-8464远程命令执行漏洞(震网漏洞)复现
前言 2017年6月13日,微软官方发布编号为CVE-2017-8464的漏洞公告,官方介绍Windows系统在解析快捷方式时存在远程执行任意代码的高危漏洞,黑客可以通过U盘.网络共享等途径触发漏洞, ...
- SimpleDateFormat日期格式(浅面)
java中使用SimpleDateFormat类的构造函数SimpleDateFormat(String str)构造格式化日期的格式, 通过format(Date date)方法将指定的日期对象格式 ...
- Java线程间通信之wait/notify
Java中的wait/notify/notifyAll可用来实现线程间通信,是Object类的方法,这三个方法都是native方法,是平台相关的,常用来实现生产者/消费者模式.我们来看下相关定义: w ...
- C/C++输入两个任意日期求相隔天数
将两个日期转换成与一个指定日期(例1970-01-01)之间的差然后计算 思路: 两个日期相隔天数的计算,首先可以将两个日期转换成time_t(从指定日期至1970年1月1日0时0分0秒相隔的秒数), ...
- Spring Mvc Url和参数名称忽略大小写
在开发过程中Spring Mvc 默认 Url和参数名称都是区分大小写的 比如:www.a.com/user/getUserInfo?userId=1 www.a.com/user/getuserIn ...
- IBM的人工智能“沃森”首次确诊罕见白血病,只用了10分钟!
患者为一名60岁的女性,最初根据诊断结果,显示她患了急髓白血病.但在经历各种疗法后,效果并不明显. 根据东大医学院研究人员Arinobu Tojo的说法,他们利用Watson系统来对此病人进行诊断.系 ...
- hibernate,createCriteria in条件 是一个集合。list 或 数组等
hibernate,createCriteria in条件 是一个集合.list 或 数组等 cq.in("states", new String[]{"2", ...