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

android 13分屏开发 android怎么分屏多任务_面试

PhoneWindowManager 类实现关系

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

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

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

android 13分屏开发 android怎么分屏多任务_android 13分屏开发_02

虚拟导航栏

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

android 13分屏开发 android怎么分屏多任务_学习_03

底部导航卡显示代码控制

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

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

1. 预制 Google Now APK


请自行安装APK

2. 修改 PhoneWindowManager 代码


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

android 13分屏开发 android怎么分屏多任务_android 13分屏开发_04

PhoneWindowManager 长按Home 建启动Google Now

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

android 13分屏开发 android怎么分屏多任务_android_05

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

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


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

android 13分屏开发 android怎么分屏多任务_android 13分屏开发_06

自定义长按Home 键的方法

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


phoneWindowManager.java 的interceptKeyBeforeQueueing 方法中修改

修改方法如下:

android 13分屏开发 android怎么分屏多任务_android 13分屏开发_07

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

动态注册广播方法如下:

android 13分屏开发 android怎么分屏多任务_学习_08

自定义广播注册

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

android 13分屏开发 android怎么分屏多任务_java_09

自定义接收广播处理

2. PhoneWindowManager 中发送广播


在 PhoneWindowManagerinterceptKeyBeforeDispatching方法中发送广播

android 13分屏开发 android怎么分屏多任务_android 13分屏开发_10

interceptKeyBeforeDispatching 发送广播

3. Destory 方法注销广播


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

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

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

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

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

android 13分屏开发 android怎么分屏多任务_学习_11

menu 键调出最近任务列表

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

android 13分屏开发 android怎么分屏多任务_面试_12

长按menu 键调出任务列表

七、 如何让 App 拿到Power key 值

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