Android经典实战之窗口和WindowManager

简介: 本文介绍了Android开发中“窗口”的基本概念及其重要性。窗口是承载用户界面的基础单位,而`WindowManager`系统服务则负责窗口的创建、更新和移除等操作。了解这些概念有助于开发复杂且用户体验良好的应用。

本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点

在Android开发中,“窗口”是一个非常基础且重要的概念。窗口通常用于承载和显示用户界面内容。了解窗口的工作机制,以及如何管理窗口,对于开发复杂的和用户体验良好的应用程序至关重要。

窗口的基本概念

1、 窗口(Window):

  • 窗口是一个抽象类,代表Android应用中的一个视图层级 (View Hierarchy) 的容器。
  • 一个窗口可以包含多个视图(View),这些视图构成了用户可见的界面。
  • 在Android中,Activity通常是窗口的主要表现形式,但窗口也可以独立于Activity存在,例如,在创建Dialog或Toast时。

2、 系统窗口(System Window):

  • 这些窗口通常是全局的,并且不局限于单个应用程序。
    • 一些系统级的界面,如状态栏、导航栏、键盘、系统提示框等,都是系统窗口。

3、 WindowManager:

  • WindowManager是Android为管理窗口提供的系统服务。
    • 它提供了一组API,允许开发者创建、调整、移除窗口等。
    • WindowManager 管理的窗口可以是应用窗口(由Activity创建)或者是独立窗口(如Toast、Dialog等)。

WindowManager与窗口管理

1. WindowManager的基本功能

WindowManager 是一个接口,定义了一系列与窗口相关的操作方法。常用的方法包括:

  • addView(View view, ViewGroup.LayoutParams params):添加一个新的窗口/视图。
  • updateViewLayout(View view, ViewGroup.LayoutParams params):更新已存在窗口/视图的布局参数。
  • removeView(View view):移除一个窗口/视图。

2. 获取 WindowManager 实例

通常情况下,可以通过 Context 来获取 WindowManager 实例:

WindowManager windowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);

3. 窗口类型与布局参数

在调用 addView 方法时,需要传递布局参数 WindowManager.LayoutParams。一些常见的属性包括:

  • type:窗口的类型,如 TYPE_APPLICATION_OVERLAY(用于创建悬浮窗口)等。
  • flags:窗口的标志位,可以控制窗口的行为和属性,如 FLAG_NOT_TOUCH_MODAL(允许触摸传递到其他窗口)等。
  • gravity:窗口的对齐方式,如 Gravity.CENTER 等。
  • xy:窗口的位置坐标。

示例代码:

// 定义一个TextView作为窗口内容
TextView myView = new TextView(this);
myView.setText("Hello, World!");

// 设置布局参数
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
    WindowManager.LayoutParams.WRAP_CONTENT,
    WindowManager.LayoutParams.WRAP_CONTENT,
    WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
    WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
    PixelFormat.TRANSLUCENT
);
params.gravity = Gravity.TOP | Gravity.LEFT;
params.x = 100;
params.y = 100;

// 添加窗口
windowManager.addView(myView, params);

系统窗口

系统窗口通常有很高的权限,可以显示在应用窗口的上方。要创建系统窗口,应用需要相应权限,比如 SYSTEM_ALERT_WINDOWOVERLAY_PERMISSION

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

需要注意,随着Android版本的更新,创建系统窗口(特别是悬浮窗口)需要处理更严格的权限管理。特别在Android 6.0 (API 23) 及以上,你需要在运行时请求权限。

Window与Activity的关系

  • Activity 与 Window: 每个Activity会和一个窗口绑定,Activity实际是通过Window来展示视图。
  • DecorView: 每个Window都有一个根视图,称为 DecorView。DecorView 包括了应用的视图层级以及系统装饰,例如标题栏、状态栏等。
// 获取Activity的窗口
Window window = getWindow();

// 获取DecorView(根视图)
View decorView = window.getDecorView();

总结

  • 窗口(Window) 是Android用户界面显示的基础单位,可以包含视图层级。
  • 系统窗口(System Window) 是系统级的全局窗口,例如状态栏、导航栏等。
  • WindowManager 是系统服务,管理窗口的创建、更新、移除等操作,可以管理应用窗口和独立窗口。
  • Activity 与 Window 有紧密的联系,每个Activity绑定一个窗口,通过窗口管理视图显示。

了解和掌握窗口概念以及WindowManager的使用方法,在复杂的Android应用开发中是非常重要的,可以帮助你更灵活和高效地管理视图和用户界面。


欢迎关注我的公众号AntDream查看更多精彩文章!

目录
相关文章
|
3月前
|
存储 消息中间件 人工智能
【03】AI辅助编程完整的安卓二次商业实战-本地构建运行并且调试-二次开发改注册登陆按钮颜色以及整体资源结构熟悉-优雅草伊凡
【03】AI辅助编程完整的安卓二次商业实战-本地构建运行并且调试-二次开发改注册登陆按钮颜色以及整体资源结构熟悉-优雅草伊凡
139 3
|
2月前
|
移动开发 前端开发 Android开发
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
314 12
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
2月前
|
移动开发 JavaScript 应用服务中间件
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
283 5
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
2月前
|
移动开发 Rust JavaScript
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
657 4
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
3月前
|
存储 消息中间件 人工智能
【08】AI辅助编程完整的安卓二次商业实战-修改消息聊天框背景色-触发聊天让程序异常终止bug牵涉更多聊天消息发送优化处理-优雅草卓伊凡
【08】AI辅助编程完整的安卓二次商业实战-修改消息聊天框背景色-触发聊天让程序异常终止bug牵涉更多聊天消息发送优化处理-优雅草卓伊凡
291 10
【08】AI辅助编程完整的安卓二次商业实战-修改消息聊天框背景色-触发聊天让程序异常终止bug牵涉更多聊天消息发送优化处理-优雅草卓伊凡
|
3月前
|
存储 消息中间件 人工智能
【05】AI辅助编程完整的安卓二次商业实战-消息页面媒体对象(Media Object)布局实战调整-按钮样式调整实践-优雅草伊凡
【05】AI辅助编程完整的安卓二次商业实战-消息页面媒体对象(Media Object)布局实战调整-按钮样式调整实践-优雅草伊凡
132 11
【05】AI辅助编程完整的安卓二次商业实战-消息页面媒体对象(Media Object)布局实战调整-按钮样式调整实践-优雅草伊凡
|
2月前
|
移动开发 Android开发
【03】建立隐私关于等相关页面和内容-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【03】建立隐私关于等相关页面和内容-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
177 0
|
3月前
|
XML 存储 Java
【06】AI辅助编程完整的安卓二次商业实战-背景布局变更增加背景-二开发现页面跳转逻辑-替换剩余图标-优雅草卓伊凡
【06】AI辅助编程完整的安卓二次商业实战-背景布局变更增加背景-二开发现页面跳转逻辑-替换剩余图标-优雅草卓伊凡
116 3
【06】AI辅助编程完整的安卓二次商业实战-背景布局变更增加背景-二开发现页面跳转逻辑-替换剩余图标-优雅草卓伊凡
|
3月前
|
存储 消息中间件 人工智能
【04】AI辅助编程完整的安卓二次商业实战-寻找修改替换新UI首页图标-菜单图标-消息列表图标-优雅草伊凡
【04】AI辅助编程完整的安卓二次商业实战-寻找修改替换新UI首页图标-菜单图标-消息列表图标-优雅草伊凡
180 4
|
3月前
|
XML 编解码 Android开发
非常经典的Android开发问题-mipmap图标目录和drawable图标目录的区别和适用场景实战举例-优雅草卓伊凡
非常经典的Android开发问题-mipmap图标目录和drawable图标目录的区别和适用场景实战举例-优雅草卓伊凡
263 0
非常经典的Android开发问题-mipmap图标目录和drawable图标目录的区别和适用场景实战举例-优雅草卓伊凡

热门文章

最新文章