通过查找资料,我知道了 Window Manager 其实是一个 service(服务)。它是全局的,系统中唯一的,是独立于android应用程序的,所有android应用程序公用的 一个单独的C++服务。(这个“单独的C++服务”的说法,建议先看看:android概念空间及seviceManager 的介绍)
1. 基本架构原理
要了解这个服务,我们首先要对android的基本架构原理有个了解。
Android 是基于 C/S 模式的。在我们的根深蒂固的想法中,C/S架构就是 客户端和服务端直接通过Binder交互数据,打开Binder写入数据,通过Binder读取数据,通讯就可以完成了。如下图:
然而,在 Android 的概念中,Binder 是一个很低层的概念,是 Linux 内核提供的 Binder 通讯机制。上面一层根本都看不到 Binder ,而是 Activity 跟一个 Service 的对象直接通过方法调用,获取服务。
这个就是Android提供给我们的外特性:在Android中,要完成某个操作,所需要做的就是请求某个有能力的服务对象去完成动作,而无需知道这个通讯是怎样工作的,以及服务在哪里。所以 Andoid 的 IPC(进程间通信)在本质上属于对象请求代理架构(对象请求代理架构:CORBA )。就是说它不仅解决了进程间的通信问题,还是一个架构,提出了一种设计理念。
既然android的IPC 的本质是CORBA,那么我们就来分析一下CORBA。
【CORBA】
由OMG组织制订的一种标准的面向对象应用程序体系规范,或者说 CORBA体系结构是对象管理组织(OMG)为解决分布式处理环境(DCE)中,硬件和软件系统的互连而提出的一种解决方案。
CORBA定议了一系列API,通信协议,和 物件/服务信息模型 用于使得异质应用程序能够互相操作,这些应用程序用不同的程序语言编写,运行在不同的平台上。CORBA因此为定义明确的物件提供了平台和位置的透明性,这些物件是分布式计算平台的基础。
COBRA标准主要分为3个层次:对象请求代理、公共对象服务和公共设施。最底层最核心就是ORB(对象请求代理)。
ORB规定了分布对象的定义(接口)和语言映射,实现对象间的通讯和互操作,是分布对象系统中的"软总线";在ORB之上定义了很多公共服务,可以提供诸如并发服务、名字服务、事务(交易)服务、安全服务等各种各样的服务;最上层的公共设施则定义了组件框架,提供可直接为业务对象使用的服务,规定业务对象有效协作所需的协定规则
【ORB】
ORB是一个在对象间建立客户/服务器联系的中件。使用ORB,客户可以调用服务器的对象或对象中的应用,被调用的对象不要求在同一台机器上。由ORB负责进行通信,同时ORB也会在调用对象完成后返回结果。客户对象完全可以不关心服务器对象的位置,实现它所采用的具体技术和工作的硬件平台,甚至不必关心服务器对象的与服务无关的接口信息,这就大大简化了客户程序的工作。既然能够这么方便,那ORB就需要提供在不同机器间应用程序间的通信,数据转换,并提供多对象系统的无缝连接。
CORBA 的本质以图的形式展现就是如下:
在服务端,多了个代理器:
分析了CORBA的大体理论架构,下面我们来看一下Android的对象代理结构:
在结构图中,我们可以较为清楚的把握Android的IPC包含了如下的概念:
设备上下文包含关于客服端,环境或者请求中没有作为参数传递个操作的上下文信息,应用程序开发者用ContextObject接口上定义的操作来创建和操作上下文。
- Android代理:这个是指服务端在客户端的代理对象
- Binder :Linux内核提供的Binder通讯机制(底层)
- AIDL : Android 中的远程接口
Android的外特性空间是不需要知道服务在那里,只要通过代理对象完成请求。
2.窗口管理概述
了解了Android 的基本架构原理,现在我们回到窗口管理这一块。
Android 的窗口管理是基于 C/S 模式的,客户端就是应用程序,服务端 就是 Window Manager服务。如下图:
Activity 建立一个主窗口之后,在将主窗口添加到 Window Manager 时,首先要建立 Window Manager的代理对象,并打开一个Session(session:会话;实现 IWindowSession AIDL 接口),并维持该会话(Activity 将通过该会话与 Window Manager 建立联系,这个Session 是C/S 体系的基础)。Client 通过这个Session 将 window 加入到 Window Manager 中。
一个完整的窗口概念包含了 View,ViewRoot,Window Manager Service,Window,Decor View,IWindow,ISession,WindowState。他们之间的关系如下:
Client 端的 Activity 通过 IWindowSession 会话与Window Manager Service 建立对话,而 Window Manager Service 通过 IWindow 接口访问 Client,将消息传递到Client 端,在通过消息分发渠道,将消息传递到具体的消息处理函数。(用户输入等操作最先是到 窗口管理服务,由窗口管理服务发给活动窗口,再一步步传递到焦点)。
3. Client 端
客户端组成:
Window,View,ViewRoot,Window Manager Proxy
View:
View 在 Android 中包含了 交互 和显示。
在Activity 在 performLaunchActivity 时,会使用Activity.attach() 建立一个 PhoneWindow 主窗口。这个主窗口的建立并不是一个重点。handleResumeActivity 真正要启动一个Activity 的时候,会将主窗口加入到 Window Manager,当然并不是主窗口本身,而是指的主窗口的 DecorView 。
DecorView :实际上是一个ViewGroup ,在依存关系上来讲,对看这主窗口来讲,DecorView 是 Top-Level View 。如下图:
View 的成员变量 mParent 用来管理 View 上级关系。而 ViewGroup 里构建了焦点管理和子 View 节点数组。这样通过 View 的mParent 和 ViewGroup的 mChildren 构建了 Android 中View直接的关系网。如下图:
Focus Path
所谓的 Foucs Path 就是我们的KeyEvent 传递的路线。一般的我们的KeyEvent 在主循环中,主View 通过View的焦点记录关系传递到焦点 View。例如下图,View22是焦点,最顶层的View 通过 mFoucs 的关系链找到最后形成的路径就是 Foucs Path。如下图红线所示:
ViewRoot
- ViewRoot 实际上是一个 Handler,ViewRoot 简历主View 与 WindowsManager 通讯的桥梁。
- ViewRoot 本质上就是一个 Handler,我们知道 Handler 的基本功能 就是处理回调,发送消息。
ViewRoot 通过 IWindowSession AIDL 添加窗口到 Window Manager ,而 IWindow AIDL 是Window Manager 分发消息给 Client ViewRoot 的渠道。
Window Manager Proxy
Activity 在使用 getSystemService 获取 WindowManagerImpl 时,建立了一个 WindowManagerImpl 的实例,这就是 Window Manager服务 的代理。
wm=(WindowManagerImpl )context.getSystemService(Context.WINDOW_SERVICE);
并调用 wm.addview 添加窗口到 WMService 中。
在这个过程中客户端建立了什么样的管理框架,并如何这个会话?
在 Window Manager Proxy 中建立了 View,Layout,ViewRoot 散着的对应关系表。构造一个ViewRoot 就会打开一个Session,并利用 IWindowSession 简历会话上下文。如下图:
4. 服务端 ---- Window Manager Service
Window Manager Service 管理的窗口是应用程序的 Top-Level 窗口,这里称之为 主窗口,为什么主窗口要放到 Service 来管理呢?其实 放在一起管理是为了计算 Z-order 序列,根据应用程序的状态来显示/隐藏应用程序的窗口。
在 Service 维护了一个 mWindow 数组,这个 mWindow 就是 Window 的 Z-order序 数组。mWindowMap 用于记录 <Client:Binder,WindowState对象>。
在服务端的窗口对象叫做 WindowState 。WindowState 有一个叫做 mClient 成员变量来记录客户端 IWindow 实例,通过 IWindow 接口实例,Service可以访问客户端的信息,可以传递消息到客户端。所以说呢 IWindow 是 Service 链接 View 的桥梁。
相关推荐
Android窗口管理遵循C/S(客户端/服务器)模式。Window在Android中代表顶级窗口,而DecorView作为Window的顶级视图,是Activity的主要视图组件,它会自动附加到Activity的主窗口上。当Activity创建其主窗口并将其...
以上就是实现“android无显示窗口摄像”的主要技术细节,涵盖的领域包括Android组件、权限管理、硬件接口、多媒体处理和系统服务等多个方面。在实际开发中,还需要考虑设备兼容性、错误处理和用户体验等因素。
本教程将详细讲解如何实现这样一个完整的、适用于真机环境的Android窗口发短信功能。 首先,我们需要了解Android的权限管理。在AndroidManifest.xml文件中,必须添加以下权限来允许应用发送短信: ```xml ...
在服务的`onCreate()`方法中,实例化`WindowManager`,并添加悬浮窗到窗口管理器: ```java @Override public void onCreate() { super.onCreate(); // 初始化悬浮窗布局... // 获取WindowManager实例... // ...
这个项目的源代码对于理解Android系统的多窗口管理、权限控制以及相机接口的使用具有很高的学习价值。 首先,我们需要了解Android的悬浮窗机制。在Android中,实现浮动窗口主要依赖于`WindowManager`服务和`...
在Android应用开发中,"弹出窗口 拍照上传"是一个常见的功能,尤其是在社交类应用中,如微信。这个功能允许用户通过点击按钮触发一个底部弹出窗口,该窗口通常包含拍照和从相册选择图片两个选项,方便用户快速分享...
综上所述,制作一个“android手电筒做成窗口小部件”涉及的主要技术点包括Android窗口小部件的创建与注册、广播接收器的使用、服务的实现以及权限管理。通过这一系列步骤,我们可以为用户提供一个直观、便捷的手电筒...
首先,你需要获取Camera对象,然后设置一个SurfaceView作为相机的预览窗口,并通过SurfaceHolder回调监听预览状态。在预览准备完成后,可以调用Camera的takePicture()方法进行拍照。这种方式需要更多的代码来管理...
总之,"Android自定义相机CameraDIY源码"项目提供了从零开始构建自定义相机功能的完整流程,包括SurfaceView的使用、Camera的管理和照片保存等关键环节。通过对这个项目的分析和学习,开发者可以深入了解Android相机...
在Android开发中,创建悬浮窗口是一项实用的技术,它允许应用在主屏幕或其他应用之上显示内容,比如我们常见的通知、快捷操作或辅助工具等。"android 创建悬浮窗口"这个主题主要涉及的是如何在Android系统中实现类似...
这涉及到Android的文件系统操作和权限管理。 8. **用户界面**: - 用户界面设计是任何应用程序的重要组成部分。特效相机可能包含选择滤镜、调整参数、切换前后摄像头等功能按钮。 9. **权限管理**: - 使用相机...
7. **权限管理**:从Android 6.0(API级别23)开始,运行时权限成为必需。使用Camera需要申请`Manifest.permission.CAMERA`权限,否则应用可能无法正常工作。 8. **兼容性处理**:由于Android设备的多样性,Camera ...
总结,基于Android平台的酷相机项目涵盖了Android相机API的使用、权限管理、图像处理、用户界面设计等多个方面,是学习和实践Android应用开发,特别是相机功能开发的宝贵资源。开发者可以在此基础上进一步拓展功能,...
在深入理解Android窗口管理机制的基础上,论文提出了整体UI系统、APP、Activity和Window子系统的多层次设计方案。 在整体UI系统层面,设计需要考虑到如何在有限的屏幕空间内合理地分配和切换多个窗口,保持界面的...
悬浮窗,大家应该也不陌生,凌驾于应用之上的一个小弹窗,实现上很简单,就是添加一个系统级别的窗口,Android中通过WindowManagerService( WMS)来管理所有的窗口,对于WMS来说,管你是Activity、Toast、Dialog,...
在源代码中,开发者可能还会看到`BluetoothAdapter`的使用,这是Android系统提供的蓝牙适配器,用来管理设备的蓝牙功能,如扫描设备、连接到特定设备等。`BluetoothLeScanner`用于扫描BLE设备,而`BluetoothDevice`...
本节我们将深入探讨如何使用AppWidgetProvider创建和管理Android窗口小部件。 首先,我们要了解窗口小部件的基础概念。在Android中,窗口小部件(Widget)是用户界面的一部分,它们可以独立于应用程序运行,并在主...
它创建了一个独立的窗口,可以避免预览画面刷新导致UI阻塞。 - TextureView:在Android 4.0中引入,更适合进行复杂的图像处理,如视频录制,因为它支持OpenGL ES纹理映射。 5. **Camera.Jar包**: 这个压缩包中的...
- **FloatWindow类**:通常是项目的入口,负责创建和管理悬浮窗口。它会实例化一个`View`并使用`WindowManager`添加到屏幕上。 - **悬浮视图设计**:源码中可能会包含自定义的`View`类,用于实现悬浮窗口的布局和...
从Android 6.0(API级别23)开始,运行时权限管理成为强制要求,因此你需要在运行时请求`Manifest.permission.CAMERA`权限。 总的来说,实现一个自定义相机涉及多个步骤,包括创建相机界面、初始化相机硬件、处理...