PhonewindowManager 使用详解

news2024/10/7 12:26:23

0297d4e5e0ff8c080cd3c7862bd5a8f4.gif

和你一起终身学习,这里是程序员Android

经典好文推荐,通过阅读本文,您将收获以下知识点:

一、Android 按键修改
二、PhoneWindowManager 简介
三、如何打开 或者 关闭 Navigation Bar
四、如何长按Home 键启动Google Now
五、如何长按实体Menu键进入多窗口模式
六、如何点击 Menu键进入调出最近任务列表
七、如何让 App 拿到Power key 值
八、如何修Activity启动背景窗口
九、WindowManagerPolicy 简介
十、参考文献

一、Android 按键修改

Android 中会有以下5个按键(BackHomeMenuPowerVolume)与用户进行交互,Framework层中实现按键功能,因此,从手机系统定制的角度,可以满足客户的客制化要求。本文主要从Framework层浅析这些客制化需求的实现。

147f6d8d92f49ced12fa78e60ef46cd3.jpeg

Back、Home、Menu、Power、Volume 按键图


MTK 平台为例,按键客制化的代码主要存放在以下类中

  1. PhoneWindowManager

PhoneWindowManager代码路径如下:

alps\frameworks\base\services\core\java\com\android\server\policy\PhoneWindowManager.java
alps\frameworks\base\core\java\android\view\WindowManagerPolicy.java

二、 PhoneWindowManager 简介

PhoneWindowManager 类实现接口如下:

java.lang.Object
    ↳  android.view.WindowManagerPolicy.java
         ↳ com.android.server.policy.PhoneWindowManager.java

facf2a5d17b3d1e6da2acb48f38c1d79.jpeg

PhoneWindowManager 类实现关系

PhoneWindowManager主要用于实现各种实体或虚拟按键处理,如需特殊处理按键,请修改源码。

三、 如何打开 或者 关闭 Navigation Bar

500a64a480448dadcc9435b3144aa76a.jpeg

虚拟导航栏

如何打开 或者 关闭 Navigation Bar 的解决方法如下:

1. 修改config.xml 文件中

搜索关键字config_showNavigationBar, 查看 config_showNavigationBar 值
true 表示显示,false 表示不显示

<!-- Whether a software navigation bar should be shown. NOTE: in the future this may be
         autodetected from the Configuration. -->
    <bool name="config_showNavigationBar">true</bool>

参考路径如下:
alps\frameworks\base\core\res\res\values\config.xml

2. 修改 system.prop 文件

查询关键字 qemu.hw.mainkeys,并查看值,1表示关闭0.表示开启 。

# temporary enables NAV bar (soft keys)
qemu.hw.mainkeys=1

不同项目文件存放地址不一样,可以使用以下命令查找
终端下查找文件方法

find 路径 -name "文件名.java"

或者直接查找文件中的字符串

find 路径 -type f -name "文件名" | xargs grep "文件中的字符串"

3. 修改PhoneWindowManager代码

如果上面两个修改都不生效(搜索关键字config_showNavigationBarqemu.hw.mainkeys),请在PhoneWindowManager 查看setInitialDisplaySize方法中mHasNavigationBar 的值是否被写死,true表示会显示、false表示不显示导航栏。

e1aa8d9dff139d617c18828d949b9039.jpeg

底部导航卡显示代码控制

四、 如何长按Home 键启动Google Now

1. 预制 Google Now APK

请自行安装APK

2. 修改 PhoneWindowManager 代码

长按Home键启动Google Now,实现方法参考launchAssistLongPressAction 功能实现。

6ecea714e98bad7b975574921a783d63.jpeg

PhoneWindowManager 长按Home 建启动Google Now

自己实现常按Home 键吊起Google Now方法,供在按键分发处理事件时候调用。

b175d0a211ad7d04470a9fb886a3a4cb.jpeg

自己实现常按Home 键吊起Google Now 方法

3. 在按键事件分发之前处理

在按键分发处理之前调用自定义长按Home键的方法

6d66f55b51ddb70c95e5a9f48232cb4d.jpeg

自定义长按Home 键的方法

4.双击Home 键调出最近任务列表请用以下方法

phoneWindowManager.java 的interceptKeyBeforeQueueing 方法中修改
修改方法如下:

fa5f0dcaf25f8601866c2b8b23d1409d.jpeg

双击Home 键调出最近任务列表

五、 如何长按实体Menu键进入多窗口模式

Android N上支持Multi-Window,通过recent key进入多窗口,对于没有打开虚拟导航栏,只有实体menu按键的手机,可以考虑向SystemUI发送广播的形式,进入Android 分屏多任务模式。
解决方案如下:

1. PhoneStatusBar 里注册广播

PhoneStatusBar 是SystemUI模块的代码,参考路径如下:

frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java

自定义广播实现可以参考系统mDemoReceiver 的实现方法
动态注册广播方法如下:

590f31452d9050f06b638ff2c4555827.jpeg

自定义广播注册

自定义接收广播后,onReceive处理事件实现分屏方法如下:

573c70aaae81d58443d4744fb02ecdfe.jpeg

自定义接收广播处理

2. PhoneWindowManager 中发送广播

在 PhoneWindowManagerinterceptKeyBeforeDispatching方法中发送广播

8144e8a63ba9ce1de1e94b667a4f1260.jpeg

interceptKeyBeforeDispatching 发送广播

3. Destory 方法注销广播

Destory方法中记得一定要注销广播

mContext.unregisterReceiver(mDemoReceiver);
 mContext.unregisterReceiver(mAppLongSwitchReceiver);

六、 如何点击 Menu键进入调出最近任务列表

如果想调出最近任务列表,需要拦截menu的事件,在PhoneWindowManagerinterceptKeyBeforeDispatching 中处理即可

d9a3038775967e2d0ff1ab86642fd630.jpeg

menu 键调出最近任务列表

如果想长按Menu调出可以使用以下方法

a0b90413f4d918230b8101b2f90dae20.jpeg

长按menu 键调出任务列表

七、 如何让 App 拿到Power key 值

一般情况下App是拿不到PowerKey值,但通过以下方法可以实现。

1. 修改PhoneWindowManager 文件实现

PhoneWindowManager 中修改interceptKeyBeforeQueueing方法实现让特定的APP拿到Power key 值

9669b99de24eef37a4c029790c569a5b.jpeg

power key 启动App

2. 如果只想让某个app的某个Activity 处理

6718afaf63a7eb36f6514a29c19a5c1b.jpeg

Power 键启动Activity 的方法

八、 如何修Activity启动是的窗口(app启动白屏,黑屏问题)

当用户从主菜单进入其他应用程序例如时钟、联系人、文件管理等时,可能会出现屏幕闪一下黑屏、白屏等问题,这种现象在当前手机主题(Theme)是浅色(例如白色)的情况下比较明显。

此所谓的闪"黑屏",其实是应用程序的启动窗口。
启动窗口出现的条件如下:

  1. 仅在要启动的Activity在新的Task或者新的Process时,才可能显示启动窗口

  2. 启动窗口先于Activity窗口显示,当Activity窗口的内容准备好之后,启动窗口就会被移除掉,show出真正的activity 窗口

  3. 启动窗口和普通的Activity window类似,只是没有画任何内容,默认是一个黑色背景的窗口

正是由于启动窗口默认是黑色背景的,所以在当前的手机主题为浅色调的时候,就比较容易因为颜色的深浅对比而产生一种视觉上的闪动感。

解决方法如下:

1.去掉启动窗口

在 ActivityStack.java中将SHOW_APP_STARTING_PREVIEW设置为false既可

2. 修改启动窗口样式

在 PhoneWindowManager中的addStartingWindow方法中添加自定义样式或者背景等

c99e58e5860c3b4bcebbfc3813cb49f5.jpeg

修改启动窗口样式

九、 WindowManagerPolicy 简介

PhoneWindowManager 实现 的接口类如下:

alps\frameworks\base\core\java\android\view\WindowManagerPolicy.java

751352034a181adf39bfad7efeda1802.jpeg

WindowManagerPolicy 接口实现

WindowManagerPolicy 是一个接口类,主要对外提供一些接口。
常用接口如下:

591725173b60c809388bd3f91c36b23f.jpeg

WindowState 接口

69b26457c979376e0cd35a7677de0080.jpeg

WindowMangerFuncs接口

f0289533f99b719e7cdf76fe1aa124f7.jpeg

Screen On 接口

30807372bcffb0531de5879e482a1570.jpeg

Keyguard 接口

参考文献:

【腾讯文档】Android Framework 知识库
https://docs.qq.com/doc/DSXBmSG9VbEROUXF5

友情推荐:

Android 开发干货集锦

至此,本篇已结束。转载网络的文章,小编觉得很优秀,欢迎点击阅读原文,支持原创作者,如有侵权,恳请联系小编删除,欢迎您的建议与指正。同时期待您的关注,感谢您的阅读,谢谢!

503cff6a185ee90f39fc7d2d9565e803.jpeg

点击阅读原文,为大佬点赞!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/795750.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

B. Vika and the Bridge

Example input 5 5 2 1 1 2 1 1 7 3 1 2 3 3 3 2 1 6 6 1 2 3 4 5 6 8 4 1 2 3 4 2 3 1 4 3 1 1 1 1 output 0 1 2 2 0 解析&#xff1a; 题意为每次只能踩相同颜色的木板&#xff0c;同时他有一次改变一块木板颜色的机会&#xff0c;问每种颜色的最大跨的步子长度中的最小…

Linux复习——基础知识

作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​ 1. 有关早期linux系统中 sysvin的init的7个级别描述正确的是( )[选择1项] A. init 1 关机状态 B. init 2 字符界面多用户模式 …

科技云报道:大模型的火烧到了AI服务器上

科技云报道原创。 大模型的纷争已经随着各大入局者公布产品后&#xff0c;热度逐渐退去&#xff0c;但是由大模型带来的产业链高频共振&#xff0c;已经传递了算力层。 表现最为激烈的&#xff0c;就是AI服务器市场。大模型带来的算力需求&#xff0c;直接引发了一波AI服务器…

算法(4)

字符串 给定一个数值的数组&#xff0c;要求组合最小的数值。 public String PrintMinNumber(Integer [] s) {if(snull) return null;String s1"";ArrayList<Integer> listnew ArrayList<Integer>(Arrays.asList(s)); // for(int i0;i<s.leng…

二维数组练习题-回形数

从键盘输入一个整数&#xff08;1~20&#xff09;&#xff0c;则以该数字为矩阵&#xff0c;将数字按照顺时针螺旋填入其中 package array;import java.util.Scanner;/*** author 苗晓强* date 2023/7/26 23:56* 回形数&#xff1a;* 从键盘输入一个整数&#xff08;1~20&…

从9G到0.3G,腾讯会议对他们的git库做了什么?

&#x1f449;导读 过去三年在线会议需求井喷&#xff0c;腾讯会议用户量骤增到3亿。快速迭代的背后&#xff0c;腾讯会议团队发现&#xff1a;业务保留了长达5年的历史数据&#xff0c;大量未进行 lfs 转换&#xff0c;新 clone 仓库本地空间占17.7G。本地磁盘面临严重告急&am…

FastSAM 论文解读

论文名称&#xff1a;Fast Segment Anything 论文地址&#xff1a;http://export.arxiv.org/pdf/2306.12156 代码地址&#xff1a;GitHub - CASIA-IVA-Lab/FastSAM: Fast Segment Anything 1. 关键内容 基于YOLOv8-seg实现了FastSAM&#xff0c;它比SAM快50倍&#xff0c;且…

数仓学习---15、数据仓库工作流调度

1、数据仓库工作流调度 1.1 调度工具部署 工具部署链接 1.2 新数据生成 1.2.1 用户行为日志 1、启动日志采集通道&#xff0c;包括Kafka、Flume等 &#xff08;1&#xff09;启动Zookeeper zk.sh start&#xff08;2&#xff09;启动Kafka kf.sh start&#xff08;3&…

【雕爷学编程】Arduino动手做(95)---GY9960手势传感器模块3

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

电容触摸屏(TP)的工艺结构

液晶显示屏(LCM),触摸屏(TP) “GG、GP、GF”这是结构分类&#xff0c;第一个字母表面材质&#xff08;又称为上层&#xff09;&#xff0c;第二个字母是触摸屏的材质&#xff08;又称为下层&#xff09;&#xff0c;两者贴合在一起。 G玻璃&#xff0c;FFILM&#xff0c;“”贴…

华为eNSP:路由引入

一、拓扑图 二、路由器的配置 1、配置路由器的IP AR1&#xff1a; [Huawei]int g0/0/0 [Huawei-GigabitEthernet0/0/0]ip add 1.1.1.1 24 [Huawei-GigabitEthernet0/0/0]qu AR2&#xff1a; [Huawei]int g0/0/0 [Huawei-GigabitEthernet0/0/0]ip add 1.1.1.2 24 [Huaw…

HarmonyOS学习路之方舟开发框架—学习ArkTS语言(状态管理 一)

状态管理概述 在前文的描述中&#xff0c;我们构建的页面多为静态界面。如果希望构建一个动态的、有交互的界面&#xff0c;就需要引入“状态”的概念。 图1 效果图 上面的示例中&#xff0c;用户与应用程序的交互触发了文本状态变更&#xff0c;状态变更引起了UI渲染&#x…

Blazor实战——Known框架多表增删改查

多表增删改查示例 本章介绍学习多张表增、删、改、查功能如何实现&#xff0c;下面以销货出库单作为示例&#xff0c;该业务栏位如下&#xff1a; 销货出库单栏位 销货单号、销货日期、状态、客户、备注 销货出库单明细栏位 商品编码、商品名称、规格型号、数量、单位、单价、…

详解rocketMq通信模块升级构想

本文从开发者的角度深入解析了基于netty的通信模块, 并通过简易扩展实现微服务化通信工具雏形, 适合于想要了解netty通信框架的使用案例, 想了解中间件通信模块设计, 以及微服务通信底层架构的同学。希望此文能给大家带来通信模块架构灵感。 概述 网络通信是很常见的需求&#…

065、故障处理之OMM_TiKV

TiKV Server OOM 对业务的影响 TiKV 上的请求失败造成异常退出region leader重新选举 raft group 开始选举新的 region leader新的region leader 上报信息给PD Server region cache频繁更新 在访问TiDB Server的region cache时&#xff0c;出现TiKV rpc相关报错后台自动进行Ba…

解放程序员,加速创新,缺少的就是一个工具而已

随着科技的不断进步和应用场景的不断扩大&#xff0c;软件开发已经成为当今世界的核心驱动力之一。 然而&#xff0c;传统的软件开发模式往往存在着繁琐的编码过程、复杂的架构设计和漫长的调试周期&#xff0c;使得程序员们难以专注于创新和高难度的研究。 很多程序员上班的时…

基于解析法和遗传算法相结合的配电网多台分布式电源降损配置(Matlab实现)

目录 1 概述 2 数学模型 2.1 问题表述 2.2 DG的最佳位置和容量&#xff08;解析法&#xff09; 2.3 使用 GA 进行最佳功率因数确定和 DG 分配 3 仿真结果与讨论 3.1 33 节点测试配电系统的仿真 3.2 69 节点测试配电系统仿真 4 结论 1 概述 为了使系统网损达到最低值&a…

一分钟学会利用GPT编写爆款标题

&#x1f3c6; 文章目标&#xff1a;学习利用GPT编写爆款标题 &#x1f340; 入门篇&#xff1a;一分钟学会利用GPT编写爆款标题 ✅ 创作者&#xff1a;熊猫Jay ✨ 个人公众号: 熊猫Jay字节之旅 (文末有链接) &#x1f341; 展望&#xff1a;若本篇讲解内容帮助到您&#xff0c…

Web网站性能压测实践 | 数据平台

一、 为什么要做压测&#xff1f; 首先解释下为什么要做性能压测&#xff1a;根据 Amazon 统计&#xff0c;每慢 100 毫秒&#xff0c;交易额下降 1%。这个统计数据为大家敲响了警钟&#xff0c;也客观说明了性能压测对于企业应用的重要性。从具体的OKR上讲&#xff0c;我们希望…

常见排序算法-Python实现

python 排序 算法 1.二分法 ​ python 32行 #codingutf-8 def binary_search(input_array, value): """Your code goes here.""" length len(input_array) left 0 right length-1 if length 1: return 0 if value input_value[0] els…