Android通信机制之Android架构(一)

前言:

         Android框架给开发者提供了四大组件Activity,Service,BroadCastReceiver,ContentProvider,

这四大组件之间是如何通信的呢?

 

一、Android四大组件短程通信:

一个完整的app是包含很多个类的,那Android是如何知道他们之间的关联关系,各个类之间又是如何通信的呢?Android给开发者提供了一个Intent(意图)来传递需要启动的界面,或者发送数据给对方。问题又来了,Intent是怎么知道需要传递的类是哪一个呢?这就是Android提供的androidManifest.xml能够发挥的作用了,Android四大组件的创建都需要在AndroidManifest.xml中注册,当用户出发控件时会执行startActivity()或startService()函数将Intent交给ActivityManagerServiceAndroid系统中的ActivityManagerService就会通过AndroidManifest.xml来查询需要启动的类。

Android通信机制之Android架构(一)_第1张图片

App在启动时Android系统中Zygote就会为该app创建一个进程(Progress),在Loading_time的时间段Android就去读取AndroidManifest.xml,这样一来Android系统就可以知道app中注册的类了。那Intent的通信Android系统规定只能在同一个Progress(进程)里面进行,如果一个app有两个进程或多个进程的时候,组件自己的通信就不能使用Intent了,这个时候Android系统给开发者提供了一个IBinder接口,来实现跨进程IPC的远程通信了

 

 

二、Android远程通信(IPC跨进程通信)

    Android有一个 Binder的类,该类提供了一个 IBinder的接口,用于去实现 IPC跨进程的通信,那 IPC究竟是如何实现跨进程通信的呢?先上 UML图:
Android通信机制之Android架构(一)_第2张图片

如上图UMLmyActivity是在一个进程里面,myService也是在一个进程里面,两个进程之间的通信是通过IBinder来进行的,看一下IBinder是如何实现跨进程通信的。

(1)      在进程1里面myActivityonCreate()函数里面执行binderService()Android系统就会通过ActivityManagerServiceAndroidMainfest.xml中去找到要绑定的Service

(2)      在进程2里面myService就会执行bindService()函数,创建出一个myBinder的类,myBinder透过Android框架的BinderBinder()构造函数中init函数去与C/C++层的BBinder交互,C/C++层的javaBinder就透过onTransact()函数将BBinder传递回给Java层的Binder了,java层的Binder执行execTransact()函数调用了就把C/C++层的BBinder指针拿到了,这样myServicemb就间接指向了C/C++层的BBinder喽;

(3)      ActivityManagerService就把进程2里面的binder交给进程1里面的myActivity了;

(4)      进程1myActivitybinder通过BinderProxy类去与C/C++进行沟通,BinderProxy是对Binder的一个封装;

(5)      BinderProxy透过Binder_JniLinux核心的BinderDriver驱动交互,BinderDriver驱动因为是处于Linux核心层的,它就可以跨过进程去与进程2中的C/C++层的IBinder通信了。

 

好了,以上就是对IPC远程通信机制的说明,后面会继续发布Android架构的相关博客,欢迎关注我的博客。

你可能感兴趣的:(android架构)