当前位置:首页 > 天道酬勤 > 正文内容

进程线程协程的区别(子进程和线程的区别)

张世龙2021年12月22日 02:29天道酬勤850

安卓进程间通信:Binder

让我先说一下进程、线程和程序的区别:

1 .一个程序有一个进程、一个主线程和多个线程。 (一般情况)

2 .进程是程序的执行示例,线程是cpu调度的基本单位。

3 .实际上,所有APP的主线程都是活动线程,而一个APP中只有一个主线程。 除非另有说明,否则可以指定在同一AndroidManifest.xml中定义的组件使用android:process运行(

第一个是概念,第三个是我们实际开发时遇到的“特殊情况”实际上经常遇到。 例如,使用百度地图时,我们需要在mianfest上注册,有这样的代码。 Android : process=' 3360 remote '意味着它将在新进程中运行。

注意:在这里选择“remote”是自由的。 可以使用其他名称在其他进程中运行此服务。 冒号’:’前缀将作为新进程名称附加在软件包正在运行的标准进程名称之后。

例如,如果APP应用程序的软件包名称为com.aa.example,则新进程的名称为com.aa.example :远程

如果设置了以冒号开头的进程名称,则这个新进程对这个APP应用程序来说是专用的。 如果此进程的名称以小写字母开头,则服务将在具有此名称的全局进程中运行。 当然,前提是有适当的权限。 这样,不同APP的不同组件就可以共享进程。

总结一下,一个进程对应一个主线程,启动并注册新的进程。 共享过程的条件是名称符合规则(以小写字母开头),因此“:远程”是专用的。

以上是名词的概念

-------------请参见

所以,在了解进程的概念之后,是不是不想了解进程之间的通信呢? 因为这和我们平时的APP发展关系不大。 是的,没问题。 如果你是初学者,想知道如果看到这里就ok了的话,进程间的通信在哪里被使用了? ---安卓的插件化编程和热修复技术

名字很高吗?

学习Binder是为了更好地理解AIDL,基于AIDL模型,进一步理解四个组件的原理。

b .了解binder,看看AMS和四个组件的关系,就像binder的两个进程Server和客户端通信一样。

c .四个主要组件的基本通信机制都基于Binder,您需要知道每个组件中的哪些类扮演Binder Client,哪些类扮演Binder Server。

一、Binder

1。 Binder中的两位大佬Client和Server两个进程(! 中显示了当前的缩放比例。

请注意客户端和服务器是相对的。 谁发消息,谁是客户端,谁收到消息,谁就是服务器。

例如,如果在两个进程a和b之间使用了Binder通信,进程a向进程b发送消息,则此时a是Binder Client,b是Binder Server; 进程b向进程a发送消息。 然后,此时b是绑定客户端,a是绑定服务器。 是顾客和开发者的关系。 提出需求的是客户端,接受的是服务器,Binder是产品或设计。 大致理解这个意思就足够了。 上面的照片:

1 .概要

图中的IPC是进程间通信的意思。

图中的服务器负责在容器中注册binder服务器。

如果将ServiceManager比喻为电话局,里面存放着各住宅的母机电话,wndSJ(binderclient )给安静的悟空)打电话,打电话后,首先被转发到电话局)进行电话局的登记当然这不是我的理解。 但是我觉得很容易记住。

2.Binder通信的进程

注:图中的SM为Servi

ceManager。

我们看到,Client想要直接调用Server的add方法,是不可以的,因为它们在不同的进程中,这时候就需要Binder来帮忙了。

首先是Server在SM这个容器中注册。其次,Client想要调用Server的add方法,就需要先获取Server对象, 但是SM不会把真正的Server对象返回给Client,而是把Server的一个代理对象返回给Client,也就是Proxy。然后,Client调用Proxy的add方法,SM会帮他去调用Server的add方法,并把结果返回给Client。

到这里binder的大致意思就讲完了,是不是感觉没啥用,所以重申一遍:binder是进程间通信的工具,理解了binder就理解了aidl,就理解了四大组件,这样是不是就觉得自己基础很扎实。

二 AIDL(AIDL是Binder的延伸)

Android系统中很多系统服务都是aidl,比如说剪切板。

AIDL中需要知道下面几个类:

IBinderIInterfaceBinderProxyStub

1)Client:

MyAidl.Stub.asInterface(某IBinder对象).sum(1, 2);

asInterface方法的作用是判断参数——也就是IBinder对象,和自己是否在同一个进程:

是,则直接转换、直接使用,接下来就跟Binder无关啦;否,则把这个IBinder参数包装成一个Proxy对象,这时调用Stub的sum方法,间接调用Proxy的sum方法。

return new MyAidl.Stub.Proxy(obj);

2)Proxy在自己的sum方法中,会使用Parcelable来准备数据,把函数名称、函数参数都写入_data,让_reply接收函数返回值。最后使用IBinder的transact方法,把数据就传给Binder的Server端了。

mRemote.transact(Stub.TRANSACTION_addBook, _data, _reply, 0); //这里的mRemote就是asInterface方法传过来的obj参数

3)Server则是通过onTransact方法接收Client进程传过来的数据,包括函数名称、函数参数,找到对应的函数,这里是sum,把参数喂进去,得到结果,返回。

所以onTransact函数经历了读数据-->执行要调用的函数-->把执行结果再写数据的过程。

总结:这个玩意我感觉没啥用。。。四大组件的原理:我们都可以对照着AIDL的这张图来看,比如说,四大组件的启动和后续流程,都是在和ActivityManagerService(简称AMS)来来回回的通信,四大组件给AMS发消息,四大组件就是Binder Client,而AMS就是Binder Server;AMS发消息通知四大组件,那么角色就互换。 那么四大组件中,比如说Activity,又是哪个类扮演了Stub的角色,哪个类扮演了Proxy的角色呢?

三。Ams

AMS全称是ActivityManagerService,管理四大组件

AMS要负责和所有App的四大组件进行通信。如果在一个App中,在AMS层面把剪切板功能给篡改了,那会导致Android系统所有的剪切板功能被篡改——这就是病毒了,如果是这样的话,Android系统早就死翘翘了。所以Android系统不允许我们这么做。

我们只能在AMS的另一侧,Client端,也就是四大组件这边做篡改,这样即使我们把剪切板功能篡改了,也只影响篡改代码所在的App,在别的App中,剪切板功能还是正常的。

所以AMS是server端,知道这么多就ok

扫描二维码推送至手机访问。

版权声明:本文由花开半夏のブログ发布,如需转载请注明出处。

本文链接:https://www.zhangshilong.cn/work/26747.html

分享给朋友:

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。