当前位置:首页 » 安卓系统 » android通讯方式

android通讯方式

发布时间: 2023-03-02 08:25:01

Ⅰ Android网络通信都有哪几种方式

Android网络编程分为两种:基于http协议的,和基于socket的。
基于Http协议:HttpClient、HttpURLConnection、AsyncHttpClient框架等
基于Socket:
(1)针对TCP/IP的Socket、ServerSocket
(2)针对UDP/IP的DatagramSocket、DatagramPackage
(3)Apache Mina框架

Ⅱ Android通信方式篇(七)-Binder机制(Native层(下))

本篇文章针对向ServiceManager注册服务 和 获取服务两个流程来做总结。在这两个过程中,ServiceManager都扮演的是服务端,与客户端之间的通信也是通过Binder IPC。

在此之前先了解下Binder的进程与线程的关系:

用户空间 :ProcessState描述一个进程,IPCThreadState对应一个进程中的一个线程。
内核空间 :binder_proc描述一个进程,统一由binder_procs全局链表保存,binder_thread对应进程的一个线程。
ProcessState与binder_proc是一一对应的。

Binder线程池 :每个Server进程在启动时会创建一个binder线程池,并向其中注册一个Binder线程;之后Server进程也可以向binder线程池注册新的线程,或者Binder驱动在探测到没有空闲binder线程时会主动向Server进程注册新的的binder线程。对于一个Server进程有一个最大Binder线程数限制15,(#define DEFAULT_MAX_BINDER_THREADS 15)。对于所有Client端进程的binder请求都是交由Server端进程的binder线程来处理的。我的理解是:binder线程是进程进行binder ipc时的一条数据处理路径。

MediaPlayerService向ServiceManager注册过程如下:

相关类:

整个过程总结如下:
1 获取BpServiceManager 与 BpBinder
由defaultServiceManager()返回的是BpServiceManager,同时会创建ProcessState对象和BpBinder对象。然后通过BpBinder执行transact,把真正工作交给IPCThreadState来处理。

2 BpBinder transact
Binder代理类调用transact()方法,真正工作还是交给IPCThreadState来进行transact工作。

3 通过IPCThreadState 包装并转换数据并进行transact事务处理
每个线程都有一个IPCThreadState,每个IPCThreadState中都有一对Parcel变量:mIn、mOut。相当于两根数据管道:

最后执行talkWithDriver。

writeTransactionData:将BC Protocol + binder_transaction_data结构体 写入mOut, 然后执行waitForResponse:

由talkWithDriver将数据进一步封装到binder_write_read结构体,通过ioctl(BINDER_WRITE_READ)与驱动通信。同时等待驱动返回的接收BR命令,从mIn取出返回的数据。

mIn包装的数据结构(注册服务handle = 0 ,code 为ADD_SERVICE_TRANSACTION):

4 Binder Driver
把binder_write_read结构体write_buffer里数据取出来,分别得到BC命令和封装好数据的事务binder_transaction_data, 然后根据handler,在当前binder_proc中,找到相应的binder_ref,由binder_ref再找到目标binder_node实体,由目标binder_node再找到目标进程binder_proc。然后就是插入数据:当binder驱动可以找到合适的线程,就会把binder_transaction节点插入到servciemanager的线程的todo队列中,如果找不到合适的线程,就把节点之间插入servciemanager的binder_proc的todo队列。

5 ServiceManager
经过Binder Driver的处理,数据已经到了ServiceManager进程,在BR_TRANSACTION的引导下,在binder_loop()中执行binder_parser()取出数据,执行do_add_service()操作,最终向 svcinfo 列表中添加已经注册的服务(没有数据的返回)。最后发送 BR_REPLY 命令唤醒等待的线程,通知注册成功。结束MediaPlayerService进程 waitForResponse()的状态,整个注册过程结束。

获取服务的过程与注册类似,首先 ServiceManager 向 Binder 驱动发送 BC_TRANSACTION 命令携带 CHECK_SERVICE_TRANSACTION 命令,同时获取服务的线程进入等待状态 waitForResponse()。Binder 驱动收到请求命令向 ServiceManager 的发送 BC_TRANSACTION 查询已注册的服务,会区分请求服务所属进程情况。

查询到直接响应 BR_REPLY 唤醒等待的线程。若查询不到将与 binder_procs 链表中的服务进行一次通讯再响应。

以startService为例来简单总结下执行流程:

3.1 从方法执行流程来看:

Client :

1 AMP.startService 标记方法以及通过Parcel包装数据;

2 BinderProxy.transact 实际调用native的 android_os_BinderProxy_transact 传递数据;

3 获取BpServiceManager 与 BpBinder 同时会创建ProcessState。然后通过BpBinder执行transact,把真正工作交给IPCThreadState来处理;

4 IPC.transact 主要执行writeTransactionData,将上层传来的数据重新包装成binder_transaction_data,并将BC Protocol + binder_transaction_data结构体 写入mOut;

5 IPC waitForResponse talkWithDriver + 等待返回数据;

6 talkWithDriver 将数据进一步封装成binder_write_read,通过ioctl(BINDER_WRITE_READ)与驱动通信;

Kernel :

7 binder ioctl 接收BINDER_WRITE_READ ioctl命令;

8 binder_ioctl_write_read 把用户空间数据ubuf拷贝到内核空间bwr;

9 binder_thread_write 当bwr写缓存有数据,则执行binder_thread_write;当写失败则将bwr数据写回用户空间并退出;

10 binder_transaction 找到目标进程binder_proc并插入数据到目标进程的线程todo队列,最终执行到它
时,将发起端数据拷贝到接收端进程的buffer结构体;

11 binder_thread_read 根据binder_transaction结构体和binder_buffer结构体数据生成新的binder_transaction_data结构体,写入bwr的read_buffer,当bwr读缓存有数据,则执行binder_thread_read;当读失败则再将bwr数据写回用户空间并退出;最后,把内核数据bwr拷贝到用户空间ubuf。

12 binder_thread_write + binder_ioctl BR命令和数据传递

Server:

13 IPC.executeCommand 解析kernel传过来的binder_transaction_data数据,找到目标BBinder并调用其transact()方法;

14 IPC.joinThreadPool 采用循环不断地执行getAndExecuteCommand()方法, 处理事务。当bwr的读写buffer都没有数据时,则阻塞在binder_thread_read的wait_event过程. 另外,正常情况下binder线程一旦创建则不会退出.

15 BBinder.transact 到Binder.exeTransact 调用 AMN.onTransact

16 AMN.onTransact 把数据传递到AMS.starService去执行

17 AMS.starService Server处理了Client的请求了

然后原路replay回去,talkWithDriver 到Kernel ,然后找到Client进程,把数据拷贝到read_buffer里,最终唤醒IPC,把反馈传递回AMP.startService。完成启动服务。

3.2 从通信协议流程来看:

非oneWay:

oneway:

oneway与非oneway区别: 都是需要等待Binder Driver的回应消息BR_TRANSACTION_COMPLETE. 主要区别在于oneway的通信收到BR_TRANSACTION_COMPLETE则返回,而不会再等待BR_REPLY消息的到来. 另外,oneway的binder IPC则接收端无法获取对方的pid.

3.3 从数据流来看

从用户空间开始:

进入驱动后:

回到用户空间:

参考:
http://gityuan.com/2016/09/04/binder-start-service/
http://gityuan.com/2015/11/28/binder-summary/
http://gityuan.com/2015/11/14/binder-add-service/
http://gityuan.com/2015/11/15/binder-get-service/

Ⅲ Flutter与Android通信的三种方式

一、 MethodChannel
主要是flutter端调用android方法。flutter调取android方法,也可以android主动跟flutter通信,但是这个只能是传递数据,不是调方法。MethodChannel的flutter调取android方法,我之前写过,可以查看如下链接, https://www.jianshu.com/p/6b677ff3350e

Android主动跟flutter通信,如下

二、 BasicMessageChannel
它是可以双端通信的,flutter端可以给Android发送消息,Android也可以给Flutter发送消息。

三、EventChannel
只能是原生发送消息给Flutter端,例如监听手机电量变化,网络变化,传感器等。

打印结果如下:

总结一下:
MethodChannel 用于传递方法调用(method invocation),是flutter调取原生方法的,也可以原生主动传递数据给Flutter。
BasicMessageChannel 用于传递字符串和半结构化的信息。是两个端相互发送数据,接收数据的。
EventChannel 用于数据流(event streams)的通信。通长用于Nativie向flutter的通信,如:手机电量变化,网络连接变化,陀螺仪,传感器等;

tip:多种类型的通道混用可能会出现报错问题。

Ⅳ 了解Android进程间通信的四种方式

由于应用程序之间不能共享内存。在不同应用程序之间交互数据(跨进程通讯),在android 

SDK中提供了4种用于跨进程通讯的方式。这4种方式正好对应于android系统中4种应用程序组

件:Activity、Content Provider、Broadcast和Service。其中Activity可以跨进程调用其他应

用程序的Activity;Content Provider可以跨进程访问其他应用程序中的数据(以Cursor对象形

式返回),当然,也可以对其他应用程序的数据进行增、删、改操 作;Broadcast可以向

android系统中所有应用程序发送广播,而需要跨进程通讯的应用程序可以监听这些广播;

Service和Content Provider类似,也可以访问其他应用程序中的数据,但不同的是,Content 

Provider返回的是Cursor对象,而Service返回的是java对象,这种可以跨进程通讯的服务叫

AIDL服务。

Ⅳ android进程间通讯方式有哪些

Android中实现不同应用进程间通讯,需要用到AIDL技术,以下为AIDL服务端和客户端实现步骤:

一、服务端:
1、在AndroidManifest.xml中定义的包路径下新建一个文件,扩展名为.aidl(如:IXxxService.aidl),系统会在gen中自动生成对应的.java文件(如:IXxxService.java)
2、在aidl文件中编写接口方法,语法同java区别不大。注意:方法参数支持java基本类型(int、long、boolean等)和(String、List、Map、CharSequence)
其它复杂类型需要自定义(实现Parcelable.Creator接口及其方法)。
3、在包路径新建一个继承 android.app.Service 的服务类,在该类中定义继承 IXxxService.Stub 抽象类的内部类并实现抽象方法,如:

[java] view plainprint?

public class XxxService extends Service {
public class XxxServiceImpl extends IXxxService.Stub {
//implements methods
...

}

@Override
public IBinder onBind(Intent intent) {
XxxServiceImpl impl = new XxxServiceImpl();
return impl; //必须返回 XxxServiceImpl 的实例
}
}

4、在AndroidManifest.xml中注册上面定义的服务

[java] view plainprint?

<!-- 注册服务 -->
<service android:name="包路径.XxxService" >
<intent-filter>
<!-- 指定调用AIDL服务的ID -->
<action android:name="包路径.IXxxService" />
</intent-filter>
</service>

二、客户端
1、将服务端中自动生成的IXxxService.java文件拷贝到客户端工程,注意:文件所在包路径必须和服务端完全一致。
2、服务可以封装成帮助类调用,也可以直接在Activity中调用,后者如:

[java] view plainprint?

// Activity 中声明服务接口变量
private IXxxService serviceInterface;

// Activity onCreate()方法中创建ServiceConnection对象,并初始化serviceInterface
private ServiceConnection serviceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// 获得AIDL服务对象
serviceInterface = IXxxService.Stub.asInterface(service);
}

@Override
public void onServiceDisconnected(ComponentName name) {
}
};

// 绑定服务,AIDL_SERVICE_ID 为 "一、服务端 4、" 中提到的“指定调用AIDL服务的ID”
bindService(new Intent(AIDL_SERVICE_ID), serviceConnection, Context.BIND_AUTO_CREATE);

注意:在Activity 的 onDestory 方法中调用解除绑定服务的方法:unbindService(serviceConnection);

3、在按钮点击等事件中就可以调用服务中定义的方法了,如:serviceInterface.xxxMethod();

注意:服务端 XxxService 不能定义为单例的,否则无法调用

Ⅵ android开发中跨进程通信有几种方式

  • 在android SDK中提供了4种用于跨进程通讯的方式,Activity、Content Provider、Broadcast和Service。

  • 介绍

  1. Activity可以跨进程调用其他应用程序;

  2. Content Provider可以跨进程访问其他应用程序中的数据;

  3. Broadcast可以向android系统中所有应用程序发送广播;

  4. Content Provider返回的是Cursor对象,而Service返回的是Java对象,这种可以跨进程通讯的服务叫AIDL服务;

Ⅶ Carson带你学Android:全面剖析Binder跨进程通信原理

从而全方位地介绍 Binder ,希望你们会喜欢。

在本文的讲解中,按照 大角度 -> 小角度 去分析 Binder ,即:

从而全方位地介绍 Binder ,希望你们会喜欢。

在讲解 Binder 前,我们先了解一些 Linux 的基础知识

具体请看文章: 操作系统:图文详解 内存映射

Binder 跨进程通信机制 模型 基于 Client - Server 模式

此处重点讲解 Binder 驱动作用中的跨进程通信的原理:

原因:

所以,原理图可表示为以下:

所以,在进行跨进程通信时,开发者只需自定义 Client & Server 进程 并 显式使用上述3个步骤,最终借助 Android 的基本架构功能就可完成进程间通信

注册服务后, Binder 驱动持有 Server 进程创建的 Binder 实体

此时, Client 进程与 Server 进程已经建立了连接

Client 进程 根据获取到的 Service 信息( Binder 代理对象),通过 Binder 驱动 建立与 该 Service 所在 Server 进程通信的链路,并开始使用服务

步骤1: Client 进程 将参数(整数a和b)发送到 Server 进程

步骤2: Server 进程根据 Client 进要求 调用 目标方法(即加法函数)

步骤3: Server 进程 将目标方法的结果(即加法后的结果)返回给 Client 进程

对比 Linux ( Android 基于 Linux )上的其他进程通信方式(管道、消息队列、共享内存、
信号量、 Socket ), Binder 机制的优点有:

特别地,对于从模型结构组成的Binder驱动来说:

不定期分享关于 安卓开发 的干货,追求 短、平、快 ,但 却不缺深度

Ⅷ android开发中跨进程通信有几种方式

Android进程间通信的几种方式 定义多进程
第一:Android应用中使用多进程只有一个办法(用NDK的fork来做除外),就是在AndroidManifest.xml中声明组件时,用android:process属性来指定。
不知定process属性,则默认运行在主进程中,主进程名字为包名。
android:process = package:remote,将运行在package:remote进程中,属于全局进程,其他具有相同shareUID与签名的APP可以跑在这个进程中。
android:process = :remote ,将运行在默认包名:remote进程中,而且是APP的私有进程,不允许其他APP的组件来访问。
第二:多进程引发的问题
静态成员和单例失效:每个进程保持各自的静态成员和单例,相互独立。
线程同步机制失效:每个进程有自己的线程锁。
SharedPreferences可靠性下降:不支持并发写,会出现脏数据。
Application多次创建:不同进程跑在不同虚拟机,每个虚拟机启动会创建自己的Application,自定义Application时生命周期会混乱。
综上,不同进程拥有各自独立的虚拟机,Application,内存空间,由此引发一系列问题。
第三: 进程间通信
Bundle/Intent传递数据:
可传递基本类型,String,实现了Serializable或Parcellable接口的数据结构。Serializable是Java的序列化方法,Parcellable是Android的序列化方法,前者代码量少(仅一句),但I/O开销较大,一般用于输出到磁盘或网卡;后者实现代码多,效率高,一般用户内存间序列化和反序列化传输。
文件共享:
对同一个文件先后写读,从而实现传输,Linux机制下,可以对文件并发写,所以要注意同步。顺便一提,Windows下不支持并发读或写。
Messenger:
Messenger是基于AIDL实现的,服务端(被动方)提供一个Service来处理客户端(主动方)连接,维护一个Handler来创建Messenger,在onBind时返回Messenger的binder。
双方用Messenger来发送数据,用Handler来处理数据。Messenger处理数据依靠Handler,所以是串行的,也就是说,Handler接到多个message时,就要排队依次处理。
AIDL:
AIDL通过定义服务端暴露的接口,以提供给客户端来调用,AIDL使服务器可以并行处理,而Messenger封装了AIDL之后只能串行运行,所以Messenger一般用作消息传递。
通过编写aidl文件来设计想要暴露的接口,编译后会自动生成响应的java文件,服务器将接口的具体实现写在Stub中,用iBinder对象传递给客户端,客户端bindService的时候,用asInterface的形式将iBinder还原成接口,再调用其中的方法。
ContentProvider:
系统四大组件之一,底层也是Binder实现,主要用来为其他APP提供数据,可以说天生就是为进程通信而生的。自己实现一个ContentProvider需要实现6个方法,其中onCreate是主线程中回调的,其他方法是运行在Binder之中的。自定义的ContentProvider注册时要提供authorities属性,应用需要访问的时候将属性包装成Uri.parse("content://authorities")。还可以设置permission,readPermission,writePermission来设置权限。 ContentProvider有query,delete,insert等方法,看起来貌似是一个数据库管理类,但其实可以用文件,内存数据等等一切来充当数据源,query返回的是一个Cursor,可以自定义继承AbstractCursor的类来实现。
Socket:
学过计算机网络的对Socket不陌生,所以不需要详细讲述。只需要注意,Android不允许在主线程中请求网络,而且请求网络必须要注意声明相应的permission。然后,在服务器中定义ServerSocket来监听端口,客户端使用Socket来请求端口,连通后就可以进行通信。

热点内容
数据结构与算法笔试题 发布:2025-05-15 01:04:20 浏览:416
搜狗输入法如何直接编辑配置文件 发布:2025-05-15 00:51:47 浏览:668
电箱都有哪些配置 发布:2025-05-15 00:30:21 浏览:74
安卓qq邀请码在哪里寻找 发布:2025-05-15 00:02:04 浏览:34
三菱fx编程口 发布:2025-05-15 00:01:23 浏览:810
医院招商引资宣传片脚本 发布:2025-05-15 00:01:21 浏览:368
linuxcftp服务器 发布:2025-05-14 23:58:18 浏览:718
探岳什么配置才有驾驶模式选择 发布:2025-05-14 23:53:17 浏览:146
如何在手机上看无限流量密码 发布:2025-05-14 23:43:31 浏览:114
19投篮脚本 发布:2025-05-14 23:36:57 浏览:513