Android使用AIDL跨进程通信
一、基本类型
1、AIDL是什么
2、AIDL的使用
1.创建AIDL文件
在app项目创建aidl文件

输入名称后,as就帮我们创建了一个AIDL文件。


定义好之后,就可以sycn project一下,然后新建一个service。在service里面创建一个内部类,继承你刚才创建的AIDL的名称里的Stub类,并实现接口方法,在onBind返回内部类的实例。
import android.os.RemoteException;
public class MyService extends Service {
public MyService() {
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
return new MyBinder();
}
class MyBinder extends Person.Stub {
@Override
public String getName() throws RemoteException {
return "456";
}
}
}
接下来,将我们的AIDL文件拷贝到第二个项目(aidlcalldemo),然后sycn project一下工程。

注意:这边的包名要跟第一个项目的一样哦,这之后在Activity中绑定服务。
package com.lyf.test.aidlcalldemo; import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.support.v7.app.AppCompatActivity;
import android.widget.Button;
import android.widget.Toast; import com.lyf.test.aidldemo.Person; import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick; public class MainActivity extends AppCompatActivity { @BindView(R.id.button)
Button button;
private Person person; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
Intent intent = new Intent();
intent.setComponent(new ComponentName("com.lyf.test.aidldemo", "com.lyf.test.aidldemo.MyService"));
bindService(intent, new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
person = Person.Stub.asInterface(service);
} @Override
public void onServiceDisconnected(ComponentName name) { }
}, BIND_AUTO_CREATE);
} @OnClick(R.id.button)
public void onViewClicked() {
try {
Toast.makeText(MainActivity.this, person.getName(), Toast.LENGTH_SHORT).show();
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
Android5.0之后只能使用显式Intent启动Service组件。
在onServiceConnected方法中通过Person.Stub.asInterface(service)获取Person对象,然后在onClick中调用person.getName()。

二、自定义类型
实现Parcelable接口

接下新建一个aidl文件,名称为我们自定义类型的名称,这边是User.aidl。
在User.aidl声明我们的自定义类型和它的完整包名,注意这边parcelable是小写的,不是Parcelable接口,一个自定类型需要一个这样同名的AIDL文件。
package com.lyf.test.aidldemo;
parcelable User;
然后定义接口方法,sycn project后就可以在service中做具体实现了。
package com.lyf.test.aidldemo; import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException; public class MyService extends Service {
public MyService() {
} @Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
return new MyBinder();
} class MyBinder extends IMyAidlInterface.Stub { @Override
public String getName() throws RemoteException {
return "456";
} @Override
public User getUserName() throws RemoteException {
return new User("789");
}
}
}
最后将我们的AIDL文件和自定义类型的java一并拷贝到第二个项目,注意包名都要一样哦。

然后就可以在Activity中使用该自定义类型的AIDL接口了。
package com.lyf.test.aidlcalldemo; import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.support.v7.app.AppCompatActivity;
import android.widget.Button;
import android.widget.Toast; import com.lyf.test.aidldemo.IMyAidlInterface; import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick; public class MainActivity extends AppCompatActivity { @BindView(R.id.button)
Button button;
private IMyAidlInterface iMyAidlInterface; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
Intent intent = new Intent();
intent.setComponent(new ComponentName("com.lyf.test.aidldemo", "com.lyf.test.aidldemo.MyService"));
bindService(intent, new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
iMyAidlInterface = IMyAidlInterface.Stub.asInterface(service);
} @Override
public void onServiceDisconnected(ComponentName name) { }
}, BIND_AUTO_CREATE);
} @OnClick(R.id.button)
public void onViewClicked() {
try {
Toast.makeText(MainActivity.this, iMyAidlInterface.getUserName().getName(), Toast.LENGTH_SHORT).show();
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
大功告成。
github项目demo:https://github.com/First-Time/AIDLDemo.git
Android使用AIDL跨进程通信的更多相关文章
- Android中的跨进程通信方法实例及特点分析(一):AIDL Service
转载请注明出处:http://blog.csdn.net/bettarwang/article/details/40947481 近期有一个需求就是往程序中增加大数据的採集点,可是由于我们的Andro ...
- Android随笔之——跨进程通信(一) Activity篇
在Android应用开发中,我们会碰到跨进程通信的情况,例如:你用QQ通讯录打电话的时候会调用系统的拨号应用.某些新闻客户端可以将新闻分享到QQ.微信等应用,这些都是跨进程通信的情况.简而言之,就是一 ...
- AIDL跨进程通信
Android跨进程通信会用到AIDL,当然跨进程通信不一定要用AIDL,像广播也是可以的,当然这里用到AIDL相对比较安全一些: AIDL允许传递基本数据类型(Java 的原生类型如int/long ...
- Android中的跨进程通信方法实例及特点分析(二):ContentProvider
1.ContentProvider简单介绍 在Android中有些数据(如通讯录.音频.视频文件等)是要供非常多应用程序使用的.为了更好地对外提供数据.Android系统给我们提供了Content P ...
- Aidl跨进程通信机制-android学习之旅(87)
Aidl简介 AIDL (Android Interface Definition Language) 是一种IDL 语言,用于生成可以在Android设备上两个进程之间进行进程间通信的代码. 如果在 ...
- Android四种跨进程通信
由于android系统中应用程序之间不能共享内存.因此,在不同应用程序之间交互数据(跨进程通讯)就稍微麻烦一些.在android SDK中提供了4种用于跨进程通讯的方式.这4种方式正好对应于andro ...
- AIDL跨进程通信报Intent must be explicit
在Android5.0机子上采用隐式启动来调试AIDL时,会出现Intent must be explicit的错误,原因是5.0的机子不允许使用隐式启动方式,解决的方法是:在启动intent时添加i ...
- android自动化测试解决跨进程通信问题
大概用这些吧: IPC Handler Messager Bundle service(binder) messageconnection ,thead.getXXX.getId 注 ...
- android 远程Service以及AIDL的跨进程通信
在Android中,Service是运行在主线程中的,如果在Service中处理一些耗时的操作,就会导致程序出现ANR. 但如果将本地的Service转换成一个远程的Service,就不会出现这样的问 ...
随机推荐
- 796. Rotate String旋转字符串
[抄题]: We are given two strings, A and B. A shift on A consists of taking string A and moving the lef ...
- 用php获取js变量的值
<script type="text/javascript"> var t1 = "fff"; var t2 = "<?php ec ...
- Solidity合约间的调用 -Solidity通过合约转ERC20代币
Solidity通过合约转ERC20代币 ERC20代币并不能像Ether一样使用sendTo.transfer(amt)来转账,ERC20代币只能通过token中定义的transfer方法来转账 ...
- etcd-v2第一集
网站:https://github.com/coreos/etcd 一些观点:https://yq.aliyun.com/articles/11035 1.etcd是键值存储仓库,配置共享和服务发现2 ...
- 《Miracle-House团队》第二次作业:西小餐项目开题报告
一.本团队项目的NABCD评分结果汇总 小组名 N A B C D 总分 Just_Do_IT! 9 7 8 7 9 40 A-Pancers 8 8 8 9 7 40 ymm3 8 9 9 8 9 ...
- 简单了解下java中的堆、栈和方法区。
堆.栈.方法区 1,首先了解下java中的数据类型. ①java中的八大基本数据类型:boolean, char , byte, short, int, long , float , double. ...
- #10072. 「一本通 3.2 例 1」Sightseeing Trip(floyd求最小环+路径)
https://loj.ac/problem/10072 针对无向图 因为Floyd是按照结点的顺序更新最短路的,所以我们在更新最短路之前先找到一个连接点k,当前的点k肯定不存在于已存在的最短路f[i ...
- 【慕课网实战】Spark Streaming实时流处理项目实战笔记十四之铭文升级版
铭文一级: 第11章 Spark Streaming整合Flume&Kafka打造通用流处理基础 streaming.conf agent1.sources=avro-sourceagent1 ...
- 实战C++对象模型之成员函数调用
先说结论:C++的类成员函数和C函数实质是一样的,只是C++类成员函数多了隐藏参数this. 通过本文的演示,可以看见这背后的一切,完全可C函数方式调用C++类普通成员函数和C++类虚拟成员函数. 为 ...
- linux下设置计划任务执行python脚本
linux下设置计划任务执行python脚本 简介 crontab命令被用来提交和管理用户的需要周期性执行的任务,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自 ...