前言:

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

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

 

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

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

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图:

如上图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架构的相关博客,欢迎关注我的博客。

更多相关文章

  1. C语言的函数递归(下)
  2. Android开发四年相关面试知识整理
  3. Android(安卓)学习笔记 Service (二) Remote Service Sample
  4. Android(安卓)NDK数据类型转换详解
  5. camp
  6. Android闹钟 AlarmManager的使用
  7. 详细讲解Android的网络通信(HttpUrlConnection和HttpClient)
  8. Android中getWidth和getMeasuredWidth的区别
  9. Android(安卓)P中Activity的管理机制

随机推荐

  1. android SQLite数据库基本操作示例
  2. android使用GPS
  3. android 虚拟摇杆绘制
  4. Android 加载服务器上的图片
  5. android中的状态保存
  6. Android Studio Error:Execution failed
  7. How to Build FFmpeg for Android
  8. android中动画效果的运用
  9. Android(安卓)异步更新UI----handler+thr
  10. mac平台adb、tcpdump捕手android移动网络