640?wx_fmt=gif

640?wx_fmt=gif

极力推荐Android 开发大总结文章:欢迎收藏程序员Android 力荐 ,Android 开发者需要的必备技能

640?wx_fmt=jpeg

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

Android Framework 框架系列之 PhoneWindowManager_第1张图片

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

本篇文章主要介绍 Android 开发中的部分知识点,通过阅读本篇文章,您将收获以下内容:

  1. Android 按键修改相关的类

  2. PhoneWindowManager 简介

  3. 如何打开 或者 关闭 Navigation Bar

  4. 如何长按Home 键启动Google Now

  5. 如何长按实体Menu键进入多窗口模式

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

  7. 如何让App拿到Power key 值

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

  9. WindowManagerPolicy 简介

1. Android 按键修改相关的类

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

  1. PhoneWindowManager

PhoneWindowManager代码路径如下:

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

PhoneWindowManager 实现 的接口类WindowManagerPolicy 代码路径如下:

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

2. PhoneWindowManager 简介

PhoneWindowManager 类实现接口如下:

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

Android Framework 框架系列之 PhoneWindowManager_第2张图片

PhoneWindowManager 类实现关系

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

3. 如何打开 或者 关闭 Navigation Bar

Android Framework 框架系列之 PhoneWindowManager_第3张图片

虚拟导航栏

解决方法:

1. 修改config.xml 文件中

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

      true

参考路径如下: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 Framework 框架系列之 PhoneWindowManager_第4张图片

底部导航卡显示代码控制

4. 如何长按Home 键启动Google Now

1. 预制 Google Now APK

请自行安装APK

2. 修改 PhoneWindowManager 代码

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

Android Framework 框架系列之 PhoneWindowManager_第5张图片

PhoneWindowManager 长按Home 建启动Google Now

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

Android Framework 框架系列之 PhoneWindowManager_第6张图片

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

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

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

Android Framework 框架系列之 PhoneWindowManager_第7张图片

自定义长按Home 键的方法

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

phoneWindowManager.java 的interceptKeyBeforeQueueing 方法中修改

Android Framework 框架系列之 PhoneWindowManager_第8张图片

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

5. 如何长按实体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 Framework 框架系列之 PhoneWindowManager_第9张图片

自定义广播注册

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

Android Framework 框架系列之 PhoneWindowManager_第10张图片

自定义接收广播处理

2. PhoneWindowManager 中发送广播

在 PhoneWindowManagerinterceptKeyBeforeDispatching方法中发送广播

Android Framework 框架系列之 PhoneWindowManager_第11张图片

interceptKeyBeforeDispatching 发送广播

  1. Destory 方法注销广播

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

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

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

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

Android Framework 框架系列之 PhoneWindowManager_第12张图片

menu 键调出最近任务列表

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

Android Framework 框架系列之 PhoneWindowManager_第13张图片

长按menu 键调出任务列表

7. 如何让 App 拿到Power key 值

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

1. 修改PhoneWindowManager 文件实现

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

Android Framework 框架系列之 PhoneWindowManager_第14张图片

power key 启动App

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

Android Framework 框架系列之 PhoneWindowManager_第15张图片

Power 键启动Activity 的方法

8. 如何修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方法中添加自定义样式或者背景等

Android Framework 框架系列之 PhoneWindowManager_第16张图片

修改启动窗口样式

9. WindowManagerPolicy 简介

PhoneWindowManager 实现 的接口类如下:

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

Android Framework 框架系列之 PhoneWindowManager_第17张图片

WindowManagerPolicy 接口实现

WindowManagerPolicy 是一个接口类,主要对外提供一些接口。

Android Framework 框架系列之 PhoneWindowManager_第18张图片

WindowState 接口

Android Framework 框架系列之 PhoneWindowManager_第19张图片

WindowMangerFuncs接口

Android Framework 框架系列之 PhoneWindowManager_第20张图片

Screen On 接口

Android Framework 框架系列之 PhoneWindowManager_第21张图片

Keyguard 接口

至此,Android 按键客制化已经可以初步实现需求,详细请看PhoneWindowManger 源码

640?wx_fmt=jpeg

至此,本篇已结束,如有不对的地方,欢迎您的建议与指正。同时期待您的关注,感谢您的阅读,谢谢!

640?wx_fmt=jpeg

如有侵权,请联系小编,小编对此深感抱歉,届时小编会删除文章,立即停止侵权行为,请您多多包涵。

640?wx_fmt=other

既然都看到这里,领两个红包在走吧!以下两个红包每天都可以领取

1.支付宝搜索 522398497,或扫码支付宝红包海报。

支付宝扫一扫,每天领取大红包

2.微信红包,微信扫一扫即可领取红包

微信扫一扫,每天领取微信红包

小礼物走一走,来简书关注我

更多相关文章

  1. Android使用自定义字体的方法
  2. Android 环信官方Demo3.3.2详细配置方法
  3. Android视频播放框架Vitamio
  4. Android Picasso 图片加载库基础使用详解
  5. Android中经常用到的方法--SDcard下文件的操作
  6. Android Intent调用方法总结
  7. Android 应用程序退出后不在运行列表中显示的方法
  8. android加载网络图片(逐行扫描格式png图片)的一个bug

随机推荐

  1. 企业分布式微服务云SpringCloud SpringBo
  2. 初用idea建立javaweb遇到的问题与心得
  3. Java递归实现算24
  4. 如何在Javascript中解析URL查询参数?(复
  5. JAVA 实现tail -f 日志文件监控功能
  6. Servlet也是一个Java类.为什么我不可以将
  7. 单例模式中的懒汉模式和饿汉模式
  8. tomcat启动web项目时候突然卡住
  9. 导致org.hibernate创建记录。MappingExce
  10. php RSA加密 JAVA 证书生成