Android通信机制之Android架构(一)
前言:
Android框架给开发者提供了四大组件Activity,Service,BroadCastReceiver,ContentProvider,
这四大组件之间是如何通信的呢?
一、Android四大组件短程通信:
一个完整的app是包含很多个类的,那Android是如何知道他们之间的关联关系,各个类之间又是如何通信的呢?Android给开发者提供了一个Intent(意图)来传递需要启动的界面,或者发送数据给对方。问题又来了,Intent是怎么知道需要传递的类是哪一个呢?这就是Android提供的androidManifest.xml能够发挥的作用了,Android四大组件的创建都需要在AndroidManifest.xml中注册,当用户出发控件时会执行startActivity()或startService()函数将Intent交给ActivityManagerService,Android系统中的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图:如上图UML中myActivity是在一个进程里面,myService也是在一个进程里面,两个进程之间的通信是通过IBinder来进行的,看一下IBinder是如何实现跨进程通信的。
(1) 在进程1里面myActivity的onCreate()函数里面执行binderService(),Android系统就会通过ActivityManagerService去AndroidMainfest.xml中去找到要绑定的Service
(2) 在进程2里面myService就会执行bindService()函数,创建出一个myBinder的类,myBinder透过Android框架的Binder中Binder()构造函数中init函数去与C/C++层的BBinder交互,C/C++层的javaBinder就透过onTransact()函数将BBinder传递回给Java层的Binder了,java层的Binder执行execTransact()函数调用了就把C/C++层的BBinder指针拿到了,这样myService的mb就间接指向了C/C++层的BBinder喽;
(3) ActivityManagerService就把进程2里面的binder交给进程1里面的myActivity了;
(4) 进程1的myActivity将binder通过BinderProxy类去与C/C++进行沟通,BinderProxy是对Binder的一个封装;
(5) BinderProxy透过Binder_Jni与Linux核心的BinderDriver驱动交互,BinderDriver驱动因为是处于Linux核心层的,它就可以跨过进程去与进程2中的C/C++层的IBinder通信了。
好了,以上就是对IPC远程通信机制的说明,后面会继续发布Android架构的相关博客,欢迎关注我的博客。
更多相关文章
- C语言的函数递归(下)
- Android开发四年相关面试知识整理
- Android(安卓)学习笔记 Service (二) Remote Service Sample
- Android(安卓)NDK数据类型转换详解
- camp
- Android闹钟 AlarmManager的使用
- 详细讲解Android的网络通信(HttpUrlConnection和HttpClient)
- Android中getWidth和getMeasuredWidth的区别
- Android(安卓)P中Activity的管理机制