1 PhonewindowManager使用详解-德赢Vwin官网 网
0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

PhonewindowManager使用详解

哆啦安全 来源:程序员Android 2023-11-08 09:48 次阅读

一、Android 按键修改

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

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

PhoneWindowManager

PhoneWindowManager代码路径如下:

alpsframeworksbaseservicescorejavacomandroidserverpolicyPhoneWindowManager.java
alpsframeworksbasecorejavaandroidviewWindowManagerPolicy.java

二、 PhoneWindowManager 简介

PhoneWindowManager类实现接口如下:

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

fd3744a4-7dce-11ee-939d-92fbcf53809c.jpg

PhoneWindowManager 类实现关系

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

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

fd47c2d4-7dce-11ee-939d-92fbcf53809c.jpg

虚拟导航栏

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

1. 修改config.xml 文件中

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

   
    true

参考路径如下:
alpsframeworksasecore es esvaluesconfig.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_showNavigationBar、qemu.hw.mainkeys),请在PhoneWindowManager查看setInitialDisplaySize方法中mHasNavigationBar的值是否被写死,true表示会显示、false表示不显示导航栏。

fd63ed42-7dce-11ee-939d-92fbcf53809c.jpg

底部导航卡显示代码控制

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

1. 预制Google Now APK

请自行安装APK

2. 修改 PhoneWindowManager 代码

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

fd6e68f8-7dce-11ee-939d-92fbcf53809c.jpg

PhoneWindowManager 长按Home 建启动Google Now

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

fd9253e4-7dce-11ee-939d-92fbcf53809c.jpg

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

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

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

fdb63e94-7dce-11ee-939d-92fbcf53809c.jpg

自定义长按Home 键的方法

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

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

fdd656e8-7dce-11ee-939d-92fbcf53809c.jpg

双击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的实现方法
动态注册广播方法如下:

fdea2c7c-7dce-11ee-939d-92fbcf53809c.jpg

自定义广播注册

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

fe07a310-7dce-11ee-939d-92fbcf53809c.jpg

自定义接收广播处理

2. PhoneWindowManager 中发送广播

在PhoneWindowManager的interceptKeyBeforeDispatching方法中发送广播

fe1296f8-7dce-11ee-939d-92fbcf53809c.jpg

interceptKeyBeforeDispatching 发送广播

3. Destory 方法注销广播

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

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

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

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

fe2b9d88-7dce-11ee-939d-92fbcf53809c.jpg

menu 键调出最近任务列表

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

fe4c582a-7dce-11ee-939d-92fbcf53809c.jpg

长按menu 键调出任务列表

七、 如何让 App 拿到Power key 值

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

1. 修改PhoneWindowManager 文件实现

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

fe720e08-7dce-11ee-939d-92fbcf53809c.jpg

power key 启动App

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

fe7f1530-7dce-11ee-939d-92fbcf53809c.jpg

Power 键启动Activity 的方法

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

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

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

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

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

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

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

解决方法如下:

1.去掉启动窗口

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

2. 修改启动窗口样式

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

fea021da-7dce-11ee-939d-92fbcf53809c.jpg

修改启动窗口样式

九、 WindowManagerPolicy 简介

PhoneWindowManager 实现 的接口类如下:

alpsframeworksasecorejavaandroidviewWindowManagerPolicy.java

feab1fe0-7dce-11ee-939d-92fbcf53809c.jpg

WindowManagerPolicy 接口实现

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

fed24e08-7dce-11ee-939d-92fbcf53809c.jpg

WindowState 接口

fef3e9e6-7dce-11ee-939d-92fbcf53809c.jpg

WindowMangerFuncs接口

ff18c248-7dce-11ee-939d-92fbcf53809c.jpg

Screen On 接口

ff2abe62-7dce-11ee-939d-92fbcf53809c.jpg

Keyguard 接口

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表德赢Vwin官网 网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 手机
    +关注

    关注

    35

    文章

    6874

    浏览量

    157543
  • Android
    +关注

    关注

    12

    文章

    3935

    浏览量

    127339
  • 源码
    +关注

    关注

    8

    文章

    639

    浏览量

    29185
  • 代码
    +关注

    关注

    30

    文章

    4779

    浏览量

    68521

原文标题:九、 WindowManagerPolicy 简介

文章出处:【微信号:哆啦安全,微信公众号:哆啦安全】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    UCOS详解

    UCOS详解!对初者来说还是不错的!
    发表于 08-24 16:27

    PCB工艺流程详解

    PCB工艺流程详解PCB工艺流程详解
    发表于 05-22 14:46

    PWM原理详解

    PWM原理详解
    发表于 03-30 19:52

    Protel DXP 实例教程详解

    Protel DXP 实例教程详解Protel DXP 实例教程详解下载介绍:Protel DXP 多媒体实例教程详解
    发表于 03-12 02:12 0次下载

    负反馈和负载的问题详解

    负反馈和负载的问题详解
    发表于 11-25 11:33 3次下载

    Modbus_通讯协议详解

    Modbus_通讯协议详解,Modbus_通讯协议详解
    发表于 12-08 14:13 0次下载

    GIF文件格式详解

    GIF文件格式详解 GIF文件格式详解 GIF文件格式详解
    发表于 05-24 10:53 2次下载

    ethercat通讯模块详解

    ethercat通讯模块详解
    发表于 09-09 08:11 57次下载

    Hex的格式详解

    Hex的格式详解
    发表于 10-31 14:46 10次下载
    Hex的格式<b class='flag-5'>详解</b>

    Prelink的交叉编译和使用详解

    Prelink的交叉编译和使用详解
    的头像 发表于 06-20 12:03 3530次阅读
    Prelink的交叉编译和使用<b class='flag-5'>详解</b>

    嵌入式详解

    嵌入式详解(stm32嵌入式开发实例)-嵌入式详解,有需要的可以参考!
    发表于 07-30 16:07 64次下载
    嵌入式<b class='flag-5'>详解</b>

    OTT机顶盒H616 android10 电源按键开关机

    diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core
    发表于 01-10 14:53 2次下载
    OTT机顶盒H616 android10 电源按键开关机

    Arduino语法详解含示例详解

    Arduino语法详解_含示例详解
    发表于 07-19 14:09 6次下载

    [源代码]Python算法详解

    [源代码]Python算法详解[源代码]Python算法详解
    发表于 06-06 17:50 0次下载

    物理设计中的问题详解

    物理设计中的问题详解
    的头像 发表于 07-05 16:56 971次阅读
    物理设计中的问题<b class='flag-5'>详解</b>