【Android N7.0】Framework层实现派发HOME按键到Application层的一种简单方案
2017-04-07 11:10
696 查看
frameworks/base/core/java/android/view/WindowManager.java
frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java
Android是不允许派发HOME按键到Application层的,其中一个原因,个人认为这是为了避免恶性软件如果同时拦截了HOME按键,BACK按键及MENU键或APP_SWITCH按键,则用户就没有办法退出Activity。因为Google保留一个HOME按键不往application层派发,可避免恶性软件的攻击。
下面介绍自己想的一种平台方实现派发HOME按键到Application层的一种简单方案,修改如下:
原文地址:http://blog.csdn.net/yelangjueqi/article/details/58587097
Framework层修改
1. WindowManager.java
......
/**
* Window type: disptach homekey keycent to application(Add by xxx)
*
* @hide
*/
public static final int PRIVATE_FLAG_DISPATCH_HOME_KEY_TO_APP = 0x00080000;
......
2. PhoneWindowManager.java
/** {@inheritDoc} */
@Override
public long interceptKeyBeforeDispatching(WindowState win, KeyEvent event, int policyFlags) {
// First we always handle the home key here, so applications
// can never break it, although if keyguard is on, we do let
// it handle it, because that gives us the correct 5 second
// timeout.
if (keyCode == KeyEvent.KEYCODE_HOME) {
WindowManager.LayoutParams attr = win != null ? win.getAttrs() : null;
if (attr != null) {
boolean dispatchHomeKeyToApp = (attr.privateFlags & PRIVATE_FLAG_DISPATCH_HOME_KEY_TO_APP) != 0;
Slog.d(TAG, "dispatch homekey to application? dispatchHomeKeyToApp = " + dispatchHomeKeyToApp);
if (dispatchHomeKeyToApp) {
return 0;
}
}
// If we have released the home key, and didn't do anything else
// while it was pressed, then it is time to go home!
......
}
}
修改截图:
3. App层使用(Activity)
@Override
public void onCreate(Bundle savedInstanceState) {
......
getWindow().addPrivateFlags(WindowManager.LayoutParams.PRIVATE_FLAG_DISPATCH_HOME_KEY_TO_APP);
}
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
Log.d(TAG, "dispatchKeyEvent code="+event.getKeyCode());
switch (event.getKeyCode()) {
case KeyEvent.KEYCODE_HOME:
// TODO
return true;
default:
break;
}
return super.dispatchKeyEvent(event);
}
Log:
dispatchKeyEvent code=3
附
基于Android N7.0制作的patch
frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java
Android是不允许派发HOME按键到Application层的,其中一个原因,个人认为这是为了避免恶性软件如果同时拦截了HOME按键,BACK按键及MENU键或APP_SWITCH按键,则用户就没有办法退出Activity。因为Google保留一个HOME按键不往application层派发,可避免恶性软件的攻击。
下面介绍自己想的一种平台方实现派发HOME按键到Application层的一种简单方案,修改如下:
原文地址:http://blog.csdn.net/yelangjueqi/article/details/58587097
Framework层修改
1. WindowManager.java......
/**
* Window type: disptach homekey keycent to application(Add by xxx)
*
* @hide
*/
public static final int PRIVATE_FLAG_DISPATCH_HOME_KEY_TO_APP = 0x00080000;
......
2. PhoneWindowManager.java
/** {@inheritDoc} */
@Override
public long interceptKeyBeforeDispatching(WindowState win, KeyEvent event, int policyFlags) {
// First we always handle the home key here, so applications
// can never break it, although if keyguard is on, we do let
// it handle it, because that gives us the correct 5 second
// timeout.
if (keyCode == KeyEvent.KEYCODE_HOME) {
WindowManager.LayoutParams attr = win != null ? win.getAttrs() : null;
if (attr != null) {
boolean dispatchHomeKeyToApp = (attr.privateFlags & PRIVATE_FLAG_DISPATCH_HOME_KEY_TO_APP) != 0;
Slog.d(TAG, "dispatch homekey to application? dispatchHomeKeyToApp = " + dispatchHomeKeyToApp);
if (dispatchHomeKeyToApp) {
return 0;
}
}
// If we have released the home key, and didn't do anything else
// while it was pressed, then it is time to go home!
......
}
}
修改截图:
3. App层使用(Activity)
@Override
public void onCreate(Bundle savedInstanceState) {
......
getWindow().addPrivateFlags(WindowManager.LayoutParams.PRIVATE_FLAG_DISPATCH_HOME_KEY_TO_APP);
}
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
Log.d(TAG, "dispatchKeyEvent code="+event.getKeyCode());
switch (event.getKeyCode()) {
case KeyEvent.KEYCODE_HOME:
// TODO
return true;
default:
break;
}
return super.dispatchKeyEvent(event);
}
Log:
dispatchKeyEvent code=3
附
基于Android N7.0制作的patch
diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java index fe24230..f7d4bc9 100644 --- a/core/java/android/view/WindowManager.java +++ b/core/java/android/view/WindowManager.java @@ -1254,6 +1254,13 @@ public interface WindowManager extends ViewManager { public static final int PRIVATE_FLAG_SUSTAINED_PERFORMANCE_MODE = 0x00040000; /** + * Window type: disptach homekey keycent to application + * + * @hide + */ + public static final int PRIVATE_FLAG_DISPATCH_HOME_KEY_TO_APP = 0x00080000; + + /** * Control flags that are private to the platform. * @hide */ diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index b939fe3..c2f2a5b 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -3056,6 +3056,16 @@ public class PhoneWindowManager implements WindowManagerPolicy { // it handle it, because that gives us the correct 5 second // timeout. if (keyCode == KeyEvent.KEYCODE_HOME) { + WindowManager.LayoutParams attr = win != null ? win.getAttrs() : null; + if (attr != null) { + boolean dispatchHomeKeyToApp = (attr.privateFlags & PRIVATE_FLAG_DISPATCH_HOME_KEY_TO_APP) != 0; + Slog.d(TAG, "dispatch homekey to application? dispatchHomeKeyToApp = " + dispatchHomeKeyToApp); + if (dispatchHomeKeyToApp) { + return 0; + } + } // If we have released the home key, and didn't do anything else // while it was pressed, then it is time to go home!
相关文章推荐
- Android 网络电台的一种实现方案
- Android一键换肤功能:一种简单的实现
- VB6.0里实现"ShellWait"的一种简单方案(VB6.0代码)
- Android动态图片选择的一种简单实现方式
- 一种夜间模式简单实现方案
- Android调用系统相册、拍照以及裁剪最简单的实现(兼容7.0)
- Masonry 布局 cell高度适应的一种方案(实现类似朋友圈简单布局)
- Android网络电台的一种实现方案(歌醉原创)
- Android一键换肤功能:一种简单的实现
- Android 滑动验证的一种简单实现
- Android无网络状态下使用GPS定位到省市县的一种简单实现方式
- Android百度地图一种简单实现多标注及响应时间的方法
- Masonry 布局 cell 高度适应的一种方案(实现类似朋友圈简单布局)
- Android弹出式菜单-一种简单的实现方式
- 一种简单的方式实现Cocos2d-x 2.x版本按层级关系派发Touch事件
- Android网络电台的一种实现方案
- 一种简单的实现多线程断点续传的方案
- Android一键换肤功能:一种简单的实现
- 一种常见(粒度,统计值)报表的实现方案
- 主规范H.264编解码器:针对消费电子应用的一种低功耗实现方案