Android 设备按键处理(1)

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

PhoneWindowManager 类实现关系

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

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

============================

虚拟导航栏

如何打开 或者 关闭 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表示不显示导航栏。

底部导航卡显示代码控制

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

=========================

1. 预制 Google Now APK


请自行安装APK

2. 修改 PhoneWindowManager 代码


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

PhoneWindowManager 长按Home 建启动Google Now

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

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

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


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

自定义长按Home 键的方法

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


phoneWindowManager.java 的interceptKeyBeforeQueueing 方法中修改

修改方法如下:

双击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 的实现方法

动态注册广播方法如下:

自定义广播注册

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

自定义接收广播处理

2. PhoneWindowManager 中发送广播


在 PhoneWindowManagerinterceptKeyBeforeDispatching方法中发送广播

interceptKeyBeforeDispatching 发送广播

3. Destory 方法注销广播


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

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

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

=======================

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

menu 键调出最近任务列表

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

长按menu 键调出任务列表

七、 如何让 App 拿到Power key 值

========================

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

1. 修改PhoneWindowManager 文件实现


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

如何成为Android高级架构师!

架构师必须具备抽象思维和分析的能力,这是你进行系统分析和系统分解的基本素质。只有具备这样的能力,架构师才能看清系统的整体,掌控全局,这也是架构师大局观的形成基础。 你如何具备这种能力呢?一是来自于经验,二是来自于学习。

架构师不仅要具备在问题领域上的经验,也需要具备在软件工程领域内的经验。也就是说,架构师必须能够准确得理解需求,然后用软件工程的思想,把需求转化和分解成可用计算机语言实现的程度。经验的积累是需要一个时间过程的,这个过程谁也帮不了你,是需要你去经历的。

但是,如果你有意识地去培养,不断吸取前人的经验的话,还是可以缩短这个周期的。这也是我整理架构师进阶此系列的始动力之一。


成为Android架构师必备知识技能

对应导图的学习笔记(由阿里P8大牛手写,我负责整理成PDF笔记)

部分内容展示

《设计思想解读开源框架》

  • 目录
  • 热修复设计
  • 插件化框架设计

    《360°全方面性能优化》
  • 设计思想与代码质量优化
  • 程序性能优化

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

img-a5Ip4YyY-1714332556626)]

  • 设计思想与代码质量优化
    [外链图片转存中…(img-vMRyyuZP-1714332556626)]
  • 程序性能优化
    [外链图片转存中…(img-RE1Hz2gF-1714332556626)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值