博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第18天Service-AIDL进程间通信
阅读量:3786 次
发布时间:2019-05-22

本文共 2811 字,大约阅读时间需要 9 分钟。

第18天Service-AIDL进程间通信

AIDL

一.AIDL简介

AIDL,全称是Android Interface Define Language,即安卓接口定义语言,可以实现安卓设备中进程之间的通信(Inter Process Communication, IPC)。安卓中的服务分为2类:本地服务(网络下载大文件,音乐播放器,后台初始化数据库的操作);远程服务(远程调用支付宝进程的服务。。)

二.AIDL的使用

假设有如下场景,需要计算a+b的值,在客户端中获取a和b的值,然后传递给服务端,服务端进行a+b的计算,并将计算结果返回给客户端。

这里的客户端和服务端均是指安卓设备中的应用,由于每一个应用对应一个进程,由此可以模拟安卓系统中通过AIDL进行进程之间的通信。

三 .使用步骤

服务端moudle:aidl_server

(1)将as切换到Project下,按照如图所示创建文件夹命名为aidl,在aidl文件夹下创建aidl文件,命名为IMyAidlInterface.aidl

在这里插入图片描述
在这里插入图片描述
(2)修改aidl文件,提供一个方法,该方法 就是处理客户端的请求
在这里插入图片描述
(3)rebuild project之后会发现自动生成一个Java文件:IMyAidlInterface.java
在这里插入图片描述
(4)在服务端中新建一个类,继承Service,在其中定义一个IBinder类型的变量iBinder,引用上述接口IMyAidlInterface.java类中的Stub类对象,实现其中的add方法,在Service的onBind方法中,返回iBinder变量。最终代码如下:

public class ServerService extends Service {
//TODO 代理人 IBinder binder=new IMyAidlInterface.Stub() {
@Override public int add(int num1, int num2) throws RemoteException {
return num1+num2; } }; @Nullable @Override public IBinder onBind(Intent intent) {
return binder; }}

(5)清单文件中注册SErverService服务,在注册时应设置exported属性为true,保证该Service能被其他应用调用,否则会报

java.lang.SecurityException: Not allowed to bind to service Intent 异常。
在这里插入图片描述

OK,服务端的服务已经配置完毕

客户端moudle:aidl_client

(1)在客户端创建同样AIDL文件,要求包名AIDL名字必须一致,内容也必须一样提供add方法,rebuild 项目

在这里插入图片描述
(2)Java代码,绑定服务调用服务器进程的方法

public class MainActivity extends AppCompatActivity {
IMyAidlInterface iMyAidlInterface; //3.绑定服务回调 private ServiceConnection connection=new ServiceConnection() {
@Override public void onServiceConnected(ComponentName name, IBinder service) {
//绑定服务成功后,返回服务端返回的binder,将其转成IMyAidlInterface调用add方法 iMyAidlInterface = IMyAidlInterface.Stub.asInterface(service); try {
int num=iMyAidlInterface.add(4,6);//调用服务端的add方法并得到结果 Toast.makeText(MainActivity.this, ""+num, Toast.LENGTH_SHORT).show(); } catch (RemoteException e) {
e.printStackTrace(); } } @Override public void onServiceDisconnected(ComponentName name) {
//解除绑定时调用, 清空接口,防止内容溢出 iMyAidlInterface=null; } }; @Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //1.绑定服务 Intent intent=new Intent(); intent.setAction("com.bawei.1609A");//设置action intent.setPackage("com.example.aidl_server");//设置服务端应用进程包名 bindService(intent,connection, Service.BIND_AUTO_CREATE); } //2.解除绑定 @Override protected void onDestroy() {
super.onDestroy(); unbindService(connection); }}

注意:先启动服务端,在启动客户端

总结:

服务端:创建aidl文件并编辑提供方法–》rebuild—>创建服务,onbind方法中返回一个binder对象—》注册服务

客户端:创建aidl文件和服务端一模一样–》rebuild–〉绑定服务调用方法

转载地址:http://bwktn.baihongyu.com/

你可能感兴趣的文章
通过图片获取地理位置
查看>>
PHP提权姿势
查看>>
Linux VI VIM编辑器
查看>>
Linux 进程管理
查看>>
Vulmap的使用
查看>>
SPSS Modeler工具笔记
查看>>
逻辑题分享
查看>>
后端开发中常用的语言
查看>>
数学考试(牛客)
查看>>
Codeforces Round #697 (Div. 3)
查看>>
Codeforces Round #705 (Div. 2)
查看>>
2021-04-11
查看>>
迷宫(BFS)
查看>>
1816. 连通(BFS+DFS+并查集)
查看>>
2021省赛总结
查看>>
Codeforces Round #719 (Div. 3)
查看>>
3. Mybatis说明typeAliases
查看>>
4. Mybatis结果集映射ResultMap
查看>>
8. Mybatis动态SQL
查看>>
1. 我的第一个Spring程序
查看>>