Android 窗口那些事儿

Android12窗口模糊(二)在WindowManager的addView方法添加的视图中实现高斯模糊效果 通过Android12系统源码具体分析高斯模糊API的底层实现逻辑 阅读详情
AI摘要

本文详细解析了Android中Window、Activity、View的关系,事件分发机制,WMS对窗口的管理,以及SurfaceFlinger、Layer与Window的联系。讨论了多窗口实现和点击/双击事件的区别。

目录

1. 📂 前言

你,是否有过这些疑问?

2. 🔱 Window

2.1 认识 Window 的几个阶段

1)阶段一:Window 约等于 Activity

2)阶段二:Window 约等于 View

3)阶段三:Window 是个抽象封装概念

2.2 Android 中的 Window 定义

2.3 Window 到底是什么?

3. 💠 Window 相关

3.1 WindowManager

1)入参1:View

2)入参2:WindowManager.LayoutParams

3) 三个方法

3.2 DecorView 与 ViewRootImpl

3.3 WindowManagerService(WMS)

3.4 Layer

3.5 SurfaceFlinger

4. ⚛️ Window 深入

4.1 Activity/Window/View 的关系

4.2 Activity/Window/DecorView/ViewRootImpl 的创建时机

4.3 DecorView 什么时候被 WindowManager 添加到 Window 中

4.4 Android 多窗口原理

4.5 Window 点击与双击事件的区别

5. ✅ Window  底层

5.1 Window/View 添加过程

5.2 布局加载流程

5.3 View 绘制流程

1)addView 流程

2)performTraversals 流程

3)Measure、Layout、Draw 三大流程

5.4 View 绘制屏幕刷新

5.5 View 事件分发机制

这些疑问,你都解决了吗?


1. 📂 前言

你,是否有过这些疑问?

        Android 中窗口的定义是什么?

        Activity、Window、View 之间的关系?

        窗口到 View 的事件分发机制,是怎样的?

        WMS 是如何管理屏幕上显示的诸多窗口的?

        Android 是默认单窗口吗?多窗口怎么实现?

        SurfaceFlinger 合成的 Layer 与窗口是一一对应的吗?

        SurfaceFlinger、Layer、Window,以及 WMS 的联系?

        点击的事件分发与双击的事件分发,为什么走的是不一套机制?

下面,就一起去探讨下这些问题吧。有些理解只是抛砖引玉,并未完全解答,还请见谅。

2. 🔱 Window

        首先这样一个场景,下图包含:Activity、Dialog、Toast。 

  • 问:图里有几个窗口?

  • 答:三个,Activity 应用窗口,Dialog 子窗口,Toast 系统窗口。

        我们知道,Android 中的窗口,其实就是由以上三种组成,分别是应用 Window、子 Window、系统 Window。

2.1 认识 Window 的几个阶段

1)阶段一:Window 约等于 Activity

        刚接触 Android 时,认为 Activity 就是一个显示文本、图片的界面,所以 Window 就约等于 Activity。

2)阶段二:Window 约等于 View

        在接触 Window、WMS 概念后,知道 Activity 内部持有 Window 对象,而 Window 实现类 PhoneWindow 内部持有 DecorView 作为根布局,开发人员编写的 ContentView 会添加到 DecorView 中,所以 Window 就约等于 View。

3)阶段三:Window 是个抽象封装概念

        在深入 Window、WMS 源码后,我们知道:

  • 每一个 Window 都对应着一个 View 和 一个 ViewRootImpl;

  • Window 作为 View 对象的容器,以 View 的方式存在,所以 Window 可以称之为 View 的直接管理者;

  • Window 并不是实际存在的,它表示一个窗口的概念,也是一个抽象的概念,封装了对窗口的操作逻辑。

2.2 Android 中的 Window 定义

        接下来,我们看看源码中 Window 类的注释:

/**
 * Abstract base class for a top-level window look and behavior policy.  An
 * instance of this class should be used as the top-level view added to the
 * window manager. It provides standard UI policies such as a background, title
 * area, default key processing, etc.
 *
 * <p>The only existing implementation of this abstract class is
 * android.view.PhoneWindow, which you should instantiate when needing a
 * Window.
 */
public abstract class Window {

}

        结合 Window 类的注释,我们知道 Window 就是一层封装,提供通用页面模板,并不是真正的窗口。

2.3 Window 到底是什么?

        Window 是一个抽象的概念,对应屏幕显示图像的一块区域,实际是 View。比如:前言中的图例情景,共包含3个 Window,分为3块区域,对应3个具体 View,当在 Dialog 的 Window 中添加、更新与删除 View,是不会影响到 Activity 和 Toast 的。

        微观角度,Window 就是 View;宏观角度,Window 是 WMS 窗口体系下的最小单位。

        其实,根本就没有具体的 Window,只有具体的 View。

3. 💠 Window 相关

3.1 WindowManager

        WindowManager 是一个接口,继承自 ViewManager 接口,它的实现类为 WindowManagerImpl,WindowManagerImpl 通过桥接模式,将所有操作全部委托给 WindowManagerGlobal 来实现。

        WindowManager 是我们访问 Window 的入口,使用 WindowManager 对 Window 进行添加、更新和删除,具体工作则由 WMS 来处理,WindowManager 和 WMS 通过 Binder 来进行跨进程通信。

        接下来,让我们先从 WindowManager.addView(view, layoutParams) 方法的2个入参开始聊起。

1)入参1:View

        View 表示需要在屏幕显示的内容,它是具体的。

2)入参2:WindowManager.LayoutParams

        LayoutParams 对内容进行约束,包括宽高、位置、类型和 flag 等。

LayoutParams.type

        表示 Window 的类型,Window 共有三种类型,分别是应用 Window、子 Window、系统 Window。

  1. 应用 Window:1 ~ 99,如:Activity 的 type 为2;

  2. 子 Window:1000 ~ 1999,如:PopupWindow 的 type 默认为1000,Dialog 的 type 为1003;

  3. 系统 Window:2000~ 2999,如:状态栏 type 为2000,Toast  type 为2005,悬浮窗口 type 为2038。

        数值越大层级越高,层级高覆盖层级低的,一般通过常量设置,系统 Window 需要申请权限。

LayoutParams.flags

        设置 Window 相关的属性,常用:FLAG_NOT_FOCUSABLE、FLAG_NOT_TOUCH_MODA、FLAG_SHOW_WHEN_LOCKED 等。

  1. FLAG_NOT_FOCUSABLE:表示窗口不需要获取焦点,也不需要接收各种事件,此属性会同时启动FLAG_NOT_TOUCH_MODAL,最终的事件会传递给下层拥有焦点的 Window;

  2. FLAG_NOT_TOUCH_MODAL:将 Window 区域以外的单击事件传递给下层的 Window, 当前 Window 内的单击事件自己处理, 一般都要开启此事件,否则其他 Window 无法收到单击事件;

  3. FLAG_SHOW_WHEN_LOCKED:可以将 Window 显示在锁屏的界面上。

3) 三个方法

        WindowManager 常用的有三个方法,addView、updateView 和removeView,这三个方法定义在 ViewManager 中,而 WindowManager 继承自 ViewManager。

package android.view;

public interface ViewManager {
    public void addView(View view, ViewGroup.LayoutParams params);
    public void updateViewLayout(View view, ViewGroup.LayoutParams params);
    public void removeView(View view);
}

3.2 DecorView 与 ViewRootImpl

        DecorView 是 FrameLayout 的子类,被认为是 Android 视图树的根节点视图。

        ViewRootImpl 是一个抽象的概念,相比于 DecorView 这种“实体”根节点,它是一个虚拟的根节点。

        Measure-Layout-Draw 三大 View 绘制流程、触屏和按键等 Input 事件传递,以及 Insets 的更新、大部分需要遍历 View 层级结构的流程,起点都是在 ViewRootImpl。

        简单来说,ViewRootImpl 不仅是 View 和 WM 的桥梁,也是事件分发的桥梁,是视图系统的核心。

3.3 WindowManagerService(WMS)

        WMS 是 Android 系统中的重要服务,管理所有窗口,也是输入事件的中转站。

        对 WMS 来说,一个窗口就是一个可以用来显示的 View 类,一个通过 WindowManagerGlobal.addView() 添加的 View。

        View 本身并不能直接从 WMS 中接收消息,而是通过实现了 IWindow 接口的 ViewRootImpl.W 类来实现。

3.4 Layer

        Layer 是一个比 Window 更底层的实现,代表屏幕上一块显示内容的区域。

        一个 Window 就是一个 Surface,对应一个 Layer。

3.5 SurfaceFlinger

        SurfaceFlinger 作用是合成所有 Layer 并送显。在 App 请求创建 Surface 时,SurfaceFlinger 会创建一个 Layer,在拿到从 WMS 传过来的 Window 宽高、位置,以及 App 提供需要绘制的 View 后合成该 Layer,然后送给屏幕进行显示。

        在 Android 平台上创建的每个 Window 都由 Surface 提供支持,所有被渲染的可见 Surface 都被 SurfaceFlinger 合成到屏幕。

4. ⚛️ Window 深入

4.1 Activity/Window/View 的关系

  1. Activity:是最上层的封装,屏蔽复杂的系统实现细节,抽象出 UI 生命周期,方便开发人员专注于界面编写,持有 Window;

  2. Window:也是一层封装,提供通用页面模板,作为视图承载器,负责视图控制,持有 DecorView,DecorView 就是 View 的根布局;

  3. View:就是视图,在 Activity.setContentView 中将 View 视图添加到 DecorView 中,一个页面通用且不变的部分交给 PhoneWindow 实现,变化的部分交给 View,让开发人员能够自由定制。

        Activity 很庞大,通过采用单一职责原则,把 View 相关的代码从 Activity 中剥离到 Window 中去。

4.2 Activity/Window/DecorView/ViewRootImpl 的创建时机

  1. Activity:在 ActivityThread 的 performLaunchActivity 方法中,通过 Instrumentation 在内部使用类加载器创建 Activity 实例;

  2. Window:在 ActivityThread 的 performLaunchActivity 方法中,调用 Activity 的 attach 方法 new 一个 PhoneWindow 然后赋值给 mWindow 成员变量;

  3. DecorView:在 Activity 的 onCreate 方法中调用 setContentView 方法,最后会调用 PhoneWindow 的 generateDecor 方法 new 一个 DecorView 然后赋值给 mDecor 成员变量;

  4. ViewRootImpl:

    1. 在 ActivityThread 的 handleResumeActivity 方法中,内部通过 WindowManagerGlobal 的 addView 方法 new 一个 ViewRootImpl 然后赋值给局部变量 root(ViewRootImpl);

    2. 通过 addView 方法,我们也注意到,一个 Window 对应一个 ViewRootImpl;

    3. 此时也会调用 setView 方法与 DecorView 进行绑定:ViewRootImpl 会声明 mView 成员变量,并在 setView 方法中给 mView 对象赋值;

    4. 和 PhoneWindow 一样会持有 DecorView,但 DecorView 的创建还是在 PhoneWindow 的;

4.3 DecorView 什么时候被 WindowManager 添加到 Window 中

  1. 即使 Activity 布局已成功添加到 DecorView 中,但 DecorView 此时还没有添加到 Window 中;

  2. 在 ActivityThread 的 handleResumeActivity 方法中,首先会调用 Activity.onResume 方法,接着调用 Activity.makeVisible 方法,在 makeVisible() 中完成 DecorView 的添加和显示。

4.4 Android 多窗口原理

        简单来说,多窗口框架的核心思想是分栈和设置栈边界。

  1. 分栈:在 Android 系统中,启动一个 Activity 之后,必定会将此 Activity 存放于某一个 Stack,Android 为了支持多窗口,在运行时创建了多个 Stack;

  2. 栈边界:在多窗口框架中,通过设置 Stack 的边界来控制里面每个 Task 的大小,最终 Task 的大小决定了里面的 Activity 的窗口大小。

4.5 Window 点击与双击事件的区别

  1. 单击走的是 MotionEvent、双击走的是 KeyEvent;

  2. MotionEvent 会返回位置坐标,KeyEvent 不会上报位置坐标。

5. ✅ Window  底层

5.1 Window/View 添加过程

  1. Window/View

  2. WindowManager.addView()

  3. WindowManagerImpl.addView()

  4. WindowManagerGlobal.addView()

  5. ViewRootImpl.setView()

  6. WindowManagerService

        WindowMangerImpl 通过桥接模式,将所有操作全部委托给 WindowManagerGlobal 来实现。

        不管是 Activity 窗口还是非 Activity 窗口,最终都要通过 ViewRootImpl.setView 向 WMS 注册窗口。

5.2 布局加载流程

  1. setContentView 中通过 LayoutInflate.inflate 加载对应布局;

  2. inflate 方法中首先调用 Resources.getLayout 通过 pull 方式 IO 加载 Xml 布局解析器到内存中;

  3. createViewFromTag 根据 xml 的 Tag 标签反射创建 View 到内存;

  4. 递归构建其中子 View,并将子 View 添加到父 ViewGroup 中。

        Android 这套布局加载流程的性能瓶颈:布局文件解析中的 IO 过程;创建 View 对象时的反射过程。

5.3 View 绘制流程

1)addView 流程
  1. ActivityThread.handleResumeActivity;

  2. WindowManagerImpl.addView;

  3. WindowMangerGlobel.addView;

  4. ViewRootImpl.setView;

  5. ViewRootImpl.scheduleTraversals;

  6. ViewRootImpl.doTraveral;

  7. ViewRootImpl.performTraversals。

2)performTraversals 流程
  1. performMeasure—DecorView.measure—DecorView.onMeasure—View.measure;

  2. performLayout—DecorView.layout—DecorView.onLayout—View.layout;

  3. performDraw—DecorView.draw—DecorView.onDraw—View.draw。

3)Measure、Layout、Draw 三大流程
  1. Context.startActivity;

  2. ActivityThread.handleLaunchActivity,执行 onCreate,完成 DecorView 和 Activity 的创建;

  3. ActivityThread.handleResumeActivity,执行 onResume,完成 DecorView 添加到 WindowManager;

  4. ViewRootImpl.performTraversals(),测量、布局、绘制, 从 DecorView 自上而下遍历整个 View 树。

5.4 View 绘制屏幕刷新

  1. CPU:主要负责 Measure、Layout、Record、Execute 数据计算工作;

  2. GPU:负责栅格化(向量图形格式表示的图像转换成位图用于显示器)、渲染,渲染好后放到 buffer(图像缓冲区)里存起来;

  3. Display:屏幕或显示器会以一定的帧率刷新,每次刷新时,就会从缓存区将图像数据读取显示出来,如果缓存区没有新数据,就一直用旧数据,这样屏幕看起来就没有变。

        CPU 准备数据,通过 Driver 层把数据交给 GPU 渲染,Display 负责消费显示内容。

5.5 View 事件分发机制

  1. 定义:将事件(MotionEvent)传递到某个具体的 View & 处理的整个过程;

  2. ViewRootImpl—DecorView—Activity—Window—DecorView(ViewGroup)—View:事件先到 DecorView 然后到 Window。当屏幕被触摸时,input 系统事件从 Native 层分发到 Framework 层,然后到 ViewRootImpl 的 DecorView,进一步到 Activity -> PhoneWindow -> DecorView,最后到 View;

  3. DecorView 怎么将事件分发给 Activity 的?

                a、在 DecorView 的 dispatchKeyEvent 方法内部通过 Window 获取 callback,然后执行 callback 的 dispatchKeyEvent ;

                b、Activity 本身实现了 Window.Callback 接口,并设置给了 Window 的 callback,所以这里的 callback 其实就是 Activity,这样事件就传递到了 Activity;

        为什么 DecorView 走了两遍:主要原因就是解耦。

  1. ViewRootImpl 并不知道 Activity 的存在,它只是持有了 DecorView,所以先传给了 DecorView,而 DecorView 知道有 Activity,所以传给了 Activity;

  2. Activity 也不知道有 DecorView ,它只是持有 PhoneWindow,于是这样一段调用链就形成了。


这些疑问,你都解决了吗?

        Android 中窗口的定义是什么?

        Activity、Window、View 之间的关系?

        窗口到 View 的事件分发机制,是怎样的?

        WMS 是如何管理屏幕上显示的诸多窗口的?

        Android 是默认单窗口吗?多窗口怎么实现?

        SurfaceFlinger 合成的 Layer 与窗口是一一对应的吗?

        SurfaceFlinger、Layer、Window,以及 WMS 的联系?

        点击的事件分发与双击的事件分发,为什么走的是不一套机制?


Android13 WindowManager addView流程分析 WindowManager的addView方法用户在窗口中添加View,整体流程图:addView方法定义在WindowManager的父类接口ViewManager中,而实现addView方法的则是WindowManagerImpl中,如下所示: WindowManagerGlobal addView 调用WindowManagerGlobal的addView方法: 首先会对参数view、params和display进行检查。注释1处,如果当前窗口要作为子窗口,就会根据父窗口对子窗口的Windo 阅读详情

相关推荐

Android 应用窗口模式检测:从isInMultiWindowMode到反射获取WindowingMode的全面解析

本文深入解析Android应用窗口模式检测,指出标准API isInMultiWindowMode()在判断全屏模式时的局限性与常见问题。为满足折叠屏、自由窗口等复杂场景的精细化适配需求,文章详细介绍了通过反射获取精确WindowingMode的进阶方法,并提供了健壮的代码实现与实战集成方案。

weixin_29294597的博客 506

Android WindowManager工具类

WindowManager提供三个方法: addView()、updateLayout()、removeView()。分别对应是添加view、更新view、移除view。其他工具类大家搜索一个就可以了。

Dream It Possible 878

Mac上快速搭建安卓开发环境:Android Studio虚拟机运行APK全攻略

本文详细指导Mac用户如何利用Android Studio官方工具快速搭建安卓开发与测试环境。核心步骤包括正确下载安装Android Studio、创建并优化安卓虚拟机,以及通过拖拽或ADB命令安装APK文件。重点解决了在Apple Silicon芯片Mac上可能遇到的性能与ABI兼容性问题,帮助开发者和测试人员高效运行和调试安卓应用。

weixin_29274969的博客 636

【学习】Android的Window和WindowMnager

学习于《Android开发艺术探索》,本文讲述了Window和WindowManger的概念和内部机制

PanicLin的博客 2526

帆软 finereport FCRA 考试 题库+答案,共收录561题,大部分有答案

帆软 finereport FCRA 考试 题库+答案,共收录561题,大部分有答案 入门基础 11.多选题 以下方式中属于FineReport中预览模式的有( ) 分页预览、填报预览、新填报预览、数据分析、移动端预览 16.判断题 FineReport报表工具必须购买激活码后才能使用。 错误,可以免费获取激活码。 29.单选题 FineReport是一款利用( )语言开发的报表工具。java 41.多选题 访问帮助文档的方式有哪些?设计器中社区菜单下-帮助文档;直接访问http://help.finere

qq_37485720的博客 2万+

华为[ENSP]OSPF的配置实例(单区域+多区域)

华为[ENSP]OSPF的配置实例(单区域+多区域)

weixin_62594100的博客 2万+

Android在系统界面上添加窗口

然后创建了一个自定义的MyView对象,作为要添加的窗口的内容。接下来,创建了WindowManager.LayoutParams对象,用于指定窗口的各种属性,比如宽度、高度、位置等。最后,通过windowManager.addView()方法将自定义的View添加到WindowManager中,从而将其显示在屏幕上。WindowManager.addView()是Android中的一个方法,用于在屏幕上添加一个窗口。它允许你在应用程序的上下文之外创建一个窗口,并将其显示在其他应用程序或系统界面上。

wolf0706的专栏 1307

第244篇 视觉SLAM后端之BA优化——Bundle Adjustment的原理

本文介绍了SLAM后端优化中的Bundle Adjustment(BA)技术。BA通过同时优化相机位姿和3D路标点位置,最小化重投影误差,解决前端估计的累积误差问题。文章详细讲解了BA的数学原理,包括目标函数构建、Gauss-Newton法和Levenberg-Marquardt法求解过程,以及利用稀疏性和Schur补加速计算的关键技术。对比了全量BA和增量BA的优缺点,并介绍了Ceres、g2o等工程实现工具。BA作为SLAM后端的核心算法,其理解深度直接影响系统性能优化能力。

郑伟强dev的专栏 345

unity与安卓通讯的一些事儿

1、unity与安卓通讯的两种方法: 第一种是unity导出安卓工程,在unity的BuildSetting窗口可以将unity工程导出为安卓工程,然后再用Eclipse或者Android Studio打开,Eclipse目前已经被放弃了,现在安卓开发都用Android Studio,然后写完通讯业务,再由Android Studio导出apk;第二种方法是在Android Studio中创建一...

weixin_33720452的博客 166

YOLO26涨点改进 | 全网独家创新,注意力改进篇| SCI一区Top | 引入AFCA自适应细粒度通道注意力,联合建模全局与局部通道依赖关系,适合目标检测、图像去雾、关键点检测、图像分类、图像分割

🔥本文提出了一种基于AFCA(自适应细粒度通道注意力)模块改进的YOLO26目标检测网络。AFCA通过联合建模全局与局部通道依赖关系,实现了更精细的通道注意力分配,能够增强目标相关特征并抑制背景噪声。该模块采用自适应融合策略动态平衡通道权重,在保持轻量级结构的同时,显著提升了小目标和复杂背景下的检测性能。文章详细介绍了AFCA的结构原理、实现优势,并提供了完整的代码实现和YAML配置文件,指导读者如何将该模块集成到YOLO26框架中。实验结果表明,AFCA在检测精度和鲁棒性方面优于传统注意力机制。

Ai缝合怪、助力小伙伴高效发论文 299

二、FM1288调试方案-工具软件使用

分析音频数据的软件需要满足以下几点:1、能打开原始pcm音频文件;2、基本的音频播放软件的操作;3、能查看分析音频数据的频率成分;4、能查看分析音频音量幅度;5、能完成基本音频处理:降噪、音量增幅限幅、滤波和均衡;

优快云mianfeixiazai001的博客 1293

android 悬浮窗那点事儿

不管是桌面小球,悬浮歌词,还是实时监控窗口等等,这些在我这里统统都叫做悬浮窗,虽然长相不同,单实质一样。我认为这些都是配饰,就像美女带的眼镜,耳环,更或者刺青等等,有了这些美女才更美,那有人就会辩驳了说“清水出芙蓉,天然去雕饰”。我只能这么回答你,人能达到这个境界的寥寥无几,更何况物乎。     不再闲扯,言归正传。     首先要把一个View贴在窗口上,当然我们必须能够管理这个窗口,就像看

dream.zhou 1599

学Simulink——基于Simulink的AUTOSAR架构下电机控制软件组件建模

本文详细介绍了在Simulink中基于AUTOSAR架构开发电机控制软件组件(SWC)的全流程。主要内容包括:首先阐述了AUTOSAR架构对汽车电子系统开发的价值,包括提高软件复用率、降低集成成本和改善验证环境。然后重点讲解了在Simulink中构建电机控制SWC的具体步骤:从创建AUTOSAR组件模型、定义数据端口和服务端口,到搭建FOC控制算法、配置运行实体,最后生成AUTOSAR描述文件和验证RTE接口。文章还提供了与基础软件(BSW)的集成方案、工程实践要点和常见问题解决方案,并以大众MEB平台等实

amy_mhd的博客 67

android 锁屏那点事儿

在我看来android有一张俊俏脸叫launcher,而这张脸上有一张面纱叫锁屏,就像诗中写的“千呼万唤始出来,犹抱琵琶半遮面”玩android就要从这面纱说起。     这张面纱虽然美丽,但是有多少人知道她的故事呢?要讲述这个故事就要从一个类开始,这个类叫做SystemServer,学习android的人都知道,有了这个类才有android绚丽的开始。     先抛开SystemServer

dream.zhou 2442

YOLOv8改进 | 主干篇 | 利用MobileNetV1替换Backbone(轻量化网络结构)

本文给大家带来的改进机制是MobileNetV1,其是专为移动和嵌入式视觉应用设计的轻量化网络结构。这些模型基于简化的架构,并利用深度可分离卷积构建轻量级深度神经网络,其引入了两个简单的全局超参数,用于在延迟和准确性之间进行有效的权衡。实验表明,MobileNets在资源和准确性的权衡方面表现出色,并在多种应用(如对象检测、细粒度分类、面部属性识别和大规模地理定位)中展现了其有效性,这个模型非常适合轻量化的读者来使用。适用检测目标:轻量化网络结构适合轻量化的读者。

Snu77的博客 3966

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

android Surface 那点事儿

首先我们要说一下Surface是什么?关于Surface的描述是这样的“Handle onto a raw buffer that is being managed by the screen compositor.”简单翻译就是“由屏幕显示内容合成器所管理的原始缓存区的句柄”。     1、Surface是一个句柄,通过Surface就可以获得原始缓冲器及其内容。     2、a raw b

dream.zhou 3331

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

详解如何实现斗鱼、B站等全局悬浮窗直播小窗口

最近业务需求需要我们直播返回或者退出直播间时,开一个小窗口在全局继续直播视频,先看效果图。调研了一下当下主流直播平台,斗鱼、BiliBili等app,都是用WindowM...

欢迎关注公众号:【码农突围】,回复9999,可以获取一份LeetCode刷题笔记 6734

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Android内存那点事儿

好久没有写了,不是忘了,也不是懒,是因为迷茫了~~不知道该学什么,该写什么,该走什么样子的路,该做什么样子的人。我嘴笨,不知道怎么把自己会的讲给别人,我愿意分享,所以我就写出来,不管是对的,错的,希望大家能取其精华去其糟粕,不要因为我而误导诸位。废话不多说了~~ 你的应用内存泄漏了么? 要看是不是存在内存泄漏,首先我们要看到内存信息,如何看到内存信息呢?这里介绍一种方法,打开Eclipse

dream.zhou 1219

Android关于Activity的那些事儿

对于Android开发者,Activity那是再熟悉不过了;而今天咱们主要谈一下Activity的主要考察点,帮助大家回顾一下Activity的尘封记忆… Android 官方文档 1. Activity的启动模式(launchMode) Activity的任务栈及启动模式 standard(默认的): singleTop: singleTask: singleInstance: single...

BertKing的专栏 424

关于 Android N 那些你不知道的事儿

今年3月,Google 破天荒提前半年发布了 Android N 开发者预览版。当然,作为一个不合格的谷粉并没有第一时间体验安装,因为至今仍然能够回忆起来去年今日此门中(雾)兴冲冲刷了 Android M Preview 的时候发现各种 Crash 就连微信也(不出所料得)中招时自己一脸懵逼的心情。当然,为自己的机智而庆幸并没有过多久,很快就有微信好友(当然也是纯纯的谷粉)反馈微信又双叒叕在 And

shangguan 756

关于android 栏沉浸式导航的一些事儿

背景 前两天看微信更新后,我自认为微信的沉浸式导航栏挺好看的,小编就想,我也把这种样式运用到我的项目如何呢?下面就一起来探讨一下,微信导航栏大家都知道,就不上图了,直接上我自己完成的效果。 主题字体颜色为黑色,导航栏background设置为透明色,大致就是这么一个思路,还有另外一种方法:通过java代码进行设置 if (Build.VERSION.SDK_INT &gt;= 21) ...

qq_34993234的博客 398

【Bugly干货分享】关于 Android N 那些你不知道的事儿

今年3月,Google 破天荒提前半年发布了 Android N 开发者预览版。当然,作为一个不合格的谷粉并没有第一时间体验安装,因为至今仍然能够回忆起来去年今日此门中(雾)兴冲冲刷了 Android M Preview 的时候发现各种 crash 就连微信也(不出所料得)中招时自己一脸懵逼的心情。本文详细介绍Android N 那些你不知道的事儿。

腾讯Bugly的专栏 9515
上一篇: 如何一周内从0到1开发一款应用商店?
下一篇: 20240516-Flyme AIOS 特种兵发布会
Swuagg
Swuagg 新星创作者: 移动开发技术领域 新星创作者: 移动开发技术领域 领域专家: 操作系统技术领域 领域专家: 操作系统技术领域
博客等级 码龄10年 2355粉丝 153原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值