一:Android处理Power按键长按操作

在Framework层中,Android4.x对Power键(KeyEvent.KEYCODE_POWER)的操作,我们从PhoneWindowManager开始分析,在分析前我这里打印了该方法的堆栈调用信息。大家可以参考一下。

public long interceptKeyBeforeDispatching(WindowState win, KeyEvent event, int policyFlags) {

......

android.util.Log.d("BILL",android.util.Log.getStackTraceString(new Throwable()));

......

}

1-13 19:35:32.458 D/BILL    (  718): java.lang.Throwable

01-13 19:35:32.458 D/BILL    (  718):
at com.android.internal.policy.impl.PhoneWindowManager.interceptKeyBeforeDispatching(PhoneWindowManager.java:2224)

01-13 19:35:32.458 D/BILL    (  718):
at com.android.server.wm.InputMonitor.interceptKeyBeforeDispatching(InputMonitor.java:501)

01-13 19:35:32.458 D/BILL    (  718):
at com.android.server.input.InputManagerService.interceptKeyBeforeDispatching(InputManagerService.java:1383)

01-13 19:35:32.458 D/BILL    (  718):
at dalvik.system.NativeStart.run(Native Method)

调用流程如下(只贴出关键代码):



interceptKeyBeforeDispatching()-->interceptPowerKeyDown()-->mPowerLongPress.run()



1>

public long interceptKeyBeforeDispatching(WindowState win, KeyEvent event, int policyFlags) {

......

case KeyEvent.KEYCODE_POWER: {

                result &= ~ACTION_PASS_TO_USER;

                if (down) {

                    mImmersiveModeConfirmation.onPowerKeyDown(isScreenOn, event.getDownTime(),

                            isImmersiveMode(mLastSystemUiFlags));

                    if (isScreenOn && !mPowerKeyTriggered

                            && (event.getFlags() & KeyEvent.FLAG_FALLBACK) == 0) {

                        mPowerKeyTriggered = true;

                        mPowerKeyTime = event.getDownTime();

                        interceptScreenshotChord();

                    }





                    ITelephony telephonyService = getTelephonyService();

                    boolean hungUp = false;

                    if (telephonyService != null) {

                        try {

                            if (telephonyService.isRinging()) {

                                // Pressing Power while there's a ringing incoming

                                // call should silence the ringer.

                                telephonyService.silenceRinger();

                            /// M: [ALPS00093981] @{

                            } else if ((isScreenOn

                                ||  mScreenOffReason == OFF_BECAUSE_OF_PROX_SENSOR)

                            /// @}

                                && (mIncallPowerBehavior

                                    & Settings.Secure.INCALL_POWER_BUTTON_BEHAVIOR_HANGUP) != 0

                                    && telephonyService.isOffhook()) {

                                // Otherwise, if "Power button ends call" is enabled,

                                // the Power button will hang up any current active call.

                                hungUp = telephonyService.endCall();

                            }

                        } catch (RemoteException ex) {

                            Log.w(TAG, "ITelephony threw RemoteException", ex);

                        }

                    }

                    interceptPowerKeyDown(!isScreenOn || hungUp

                            || mVolumeDownKeyTriggered || mVolumeUpKeyTriggered);


                } else {

                    mPowerKeyTriggered = false;

                    cancelPendingScreenshotChordAction();

                    if (interceptPowerKeyUp(canceled || mPendingPowerKeyUpCanceled)) {

                        result = (result & ~ACTION_WAKE_UP) | ACTION_GO_TO_SLEEP;

                    }

                    mPendingPowerKeyUpCanceled = false;

                }

                break;

            }

......

}

注!红色为判断长按(down),蓝色为判断短按(up)。

2>

private void interceptPowerKeyDown(boolean handled) {

        mPowerKeyHandled = handled;

        if (!handled) {

            mHandler.postDelayed(mPowerLongPress, ViewConfiguration.getGlobalActionKeyTimeout());

        }

    }

3>

private final Runnable mPowerLongPress = new Runnable() {

......

            case LONG_PRESS_POWER_GLOBAL_ACTIONS:

                mPowerKeyHandled = true;

                if (!performHapticFeedbackLw(null, HapticFeedbackConstants.LONG_PRESS, false)) {

                    performAuditoryFeedbackForAccessibilityIfNeed();

                }

                sendCloseSystemWindows(SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS);

                showGlobalActionsDialog();

                break;

            case LONG_PRESS_POWER_SHUT_OFF:

            case LONG_PRESS_POWER_SHUT_OFF_NO_CONFIRM:

                mPowerKeyHandled = true;

                performHapticFeedbackLw(null, HapticFeedbackConstants.LONG_PRESS, false);

                sendCloseSystemWindows(SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS);

                mWindowManagerFuncs.shutdown(resolvedBehavior == LONG_PRESS_POWER_SHUT_OFF);

                break;

......

};

注:上述代码中下划线即弹出(关机、重启、飞行模式等选项)的对话框。

Android Framework层Power键关机流程(一,Power长按键操作处理)的更多相关文章

  1. Android Framework层Power键关机流程(二,关机流程)

    二,关机流程 从前一篇博文我们知道,当用户长按Power键时会弹出(关机.重启,飞行模式等选项)对话框,我们点击关机,则会弹出关机确认对话框.那么从选项对话框到关机确认对话框又是一个什么流程呢.下面我 ...

  2. 怎样从C++代码直接訪问android framework层的WifiService

    说究竟,Java层的service就是就C++层的binder的封装.所以从原理上来讲通过C++代码直接訪问android framework层的service是全然可能的,这篇文章以訪问WifiSe ...

  3. Android framework层实现实现wifi无缝切换AP

    http://www.linuxidc.com/Linux/2013-12/93476.htm Android市场上有一款叫Wifijumper的软件,实现相同ssid的多个AP之间根据wifi信号的 ...

  4. Android的NDK开发(5)————Android JNI层实现文件的read、write与seek操作

    1. 在Android的Java层实现文件的读写操作是非常简单的,可以参看之前写的博文:http://blog.csdn.net/conowen/article/details/7296121 在JN ...

  5. 如何调试Android Framework?

    Linus有一句名言广为人知:Read the fucking source code. 但其实,要深入理解某个软件.框架或者系统的工作原理,仅仅「看」代码是远远不够的.就拿Android Frame ...

  6. Android 9.0 关机流程分析

    极力推荐文章:欢迎收藏 Android 干货分享 阅读五分钟,每日十点,和您一起终身学习,这里是程序员Android 本篇文章主要介绍 Android 开发中的部分知识点,通过阅读本篇文章,您将收获以 ...

  7. Android 屏蔽Power键 Home键

    Android 屏蔽Power键 Home键 标签: androidpower键Home键PhoneWindowManagerframework 2014-04-18 17:22 1557人阅读 评论 ...

  8. 【Android】Sensor框架Framework层解读

    Sensor整体架构 整体架构说明 黄色部分表示硬件,它要挂在I2C总线上 红色部分表示驱动,驱动注册到Kernel的Input Subsystem上,然后通过Event Device把Sensor数 ...

  9. Android开发如何定制framework层服务

    刚刚跨完年,新年第一篇文章,那么今天将对Android开发framework中间层的服务定制使用作个总结.首先我们先导入Android平台源码framework层的代码到开发工具eclipse中,代码 ...

随机推荐

  1. 二、快速起步(Mysql镜像)

    1.登录镜像站点 docker login daocloud.io 用户名 密码 邮箱 1.1 拉取镜像 docker pull [option] name:[tag] 例如 docker pull ...

  2. log4j日志不输出MyBatis SQL脚本?

    日志输出级别调成debug,然并卵? 试试加下这个包. <dependency> <groupId>org.slf4j</groupId> <artifact ...

  3. ambari之hbase数据迁移

    一.hbase原理剖析 Base是一个构建在HDFS上的分布式列存储系统:HBase是基于Google BigTable模型开发的,典型的key/value系统:HBase是Apache Hadoop ...

  4. 管道函数(%>%)很简单

    %>%来自dplyr包的管道函数,其作用是将前一步的结果直接传参给下一步的函数,从而省略了中间的赋值步骤,可以大量减少内存中的对象,节省内存 符号%>%,这是管道操作,其意思是将%> ...

  5. Web页面速度测试工具

    开发框架的时间,想测试单例和多例下对性能的影响,找了下没有特别简单易用的测试工具. 估摸着搞了一个小工具. 针对.net Framework的2.0,3.5,4.0版本. WebHttpTest2.0 ...

  6. Selenium Web 自动化 - 项目实战(三)

    Selenium Web 自动化 - 项目实战(三) 2016-08-10 目录 1 关键字驱动概述2 框架更改总览3 框架更改详解  3.1 解析新增页面目录  3.2 解析新增测试用例目录  3. ...

  7. hdu3247Resource Archiver(ac自动机+spfa)

    链接 这题没想到怎么做,问了下p队长,大悟.. 先求出任意两串的在trie树上的最短距离,期间是不能走到不合法的地方,我是用spfa求得,在更新和加入节点时判断一下是不是合法位置. 求出最短距离之后, ...

  8. Thread-0" kafka.common.FailedToSendMessageException: Failed to send messages after 3 tries.

    http://blog.csdn.net/jingshuigg/article/details/25001979 zookeeper.connect=localhost:2181改成zookeeper ...

  9. spm总结

    自己尽量做出来,不要等和依靠,发挥主观能动性,所有的配置都在features模块里,一个一个的慢慢找和点击查找

  10. SQL Server 用户名密码查看

    因为SQL Server是默认使用Windows身份验证的,很多时间就会慢慢忘记掉原来设置的密码,那么怎么重新设置用户名密码呢 这里以SQL Server2013为例,先以windows身份验证登陆进 ...