按键事件分发

关机流程: ViewRootImpl -> PhoneWindowManager -> GlobalAction -> StatusBarManagerService -> commandQueue -> GlobalActionImpl

dispatchUnhandledKey -> interceptFallback -> interceptKeyBeforeQueueing

按键的时间源头: InputDispatcher.cpp 参考文章

底层从eventhub事件传递看一下文章。

Android输入系统(三)——InputReader的加工类型和InputDispatcher的分发过程(基于Android 13)_一切皆是定数的博客-CSDN博客

1. InputDispatcherFactory.cpp

  1. com_android_server_input_InputManagerService.cpp
    NativeInputManager::NativeInputManager(jobject contextObj,jobject serviceObj, const sp<Looper>& looper) :mLooper(looper), mInteractive(true) {JNIEnv* env = jniEnv();mServiceObj = env->NewGlobalRef(serviceObj);{AutoMutex _l(mLock);mLocked.systemUiLightsOut = false;mLocked.pointerSpeed = 0;mLocked.pointerGesturesEnabled = true;mLocked.showTouches = false;mLocked.pointerCapture = false;mLocked.pointerDisplayId = ADISPLAY_ID_DEFAULT;}mInteractive = true;InputManager* im = new InputManager(this, this);mInputManager = im;defaultServiceManager()->addService(String16("inputflinger"), im);
    }
    InputManager::InputManager(const sp<InputReaderPolicyInterface>& readerPolicy,const sp<InputDispatcherPolicyInterface>& dispatcherPolicy) {mDispatcher = createInputDispatcher(dispatcherPolicy);mClassifier = new InputClassifier(mDispatcher);mReader = createInputReader(readerPolicy, mClassifier);
    } 
    namespace android {sp<InputDispatcherInterface> createInputDispatcher(const sp<InputDispatcherPolicyInterface>& policy) {return new android::inputdispatcher::InputDispatcher(policy);
    }} 

    2. InputDispatcher.cpp

  2. InputDispatcher.cpp InputDispatcher::InputDispatcher(const sp<InputDispatcherPolicyInterface>& policy): mPolicy(policy),

    3. InputManagerService.java

  1. InputManagerService
    // Native callback.
    private long interceptKeyBeforeDispatching(IBinder focus, KeyEvent event, int policyFlags) {return mWindowManagerCallbacks.interceptKeyBeforeDispatching(focus, event, policyFlags);
    }
    
    /*** Provides an opportunity for the window manager policy to process a key before* ordinary dispatch.*/
    @Override
    public long interceptKeyBeforeDispatching(IBinder focusedToken, KeyEvent event, int policyFlags) {return mService.mPolicy.interceptKeyBeforeDispatching(focusedToken, event, policyFlags);
    }
    WindowManagerService.java
    private WindowManagerService(Context context, InputManagerService inputManager,boolean showBootMsgs, boolean onlyCore, WindowManagerPolicy policy,ActivityTaskManagerService atm, DisplayWindowSettingsProviderdisplayWindowSettingsProvider, Supplier<SurfaceControl.Transaction> transactionFactory,Supplier<Surface> surfaceFactory,Function<SurfaceSession, SurfaceControl.Builder> surfaceControlFactory) {
    SystemServer.java wm = WindowManagerService.main(context, inputManager, !mFirstBoot, mOnlyCore,new PhoneWindowManager(), mActivityManagerService.mActivityTaskManager);

    4. PhoneWindowManager

  2. 
    // TODO(b/117479243): handle it in InputPolicy
    /** {@inheritDoc} */
    @Override
    public long interceptKeyBeforeDispatching(IBinder focusedToken, KeyEvent event,int policyFlags) {```case KeyEvent.KEYCODE_POWER: {EventLogTags.writeInterceptPower(KeyEvent.actionToString(event.getAction()),mPowerKeyHandled ? 1 : 0, mPowerKeyPressCounter);// Any activity on the power button stops the accessibility shortcutcancelPendingAccessibilityShortcutAction();result &= ~ACTION_PASS_TO_USER;isWakeKey = false; // wake-up will be handled separatelyif (down) {interceptPowerKeyDown(event, interactive);} else {interceptPowerKeyUp(event, interactive, canceled);}break;}```
    }
    private void powerLongPress() {final int behavior = getResolvedLongPressOnPowerBehavior();switch (behavior) {case LONG_PRESS_POWER_NOTHING:break;case LONG_PRESS_POWER_GLOBAL_ACTIONS:mPowerKeyHandled = true;performHapticFeedback(HapticFeedbackConstants.LONG_PRESS, false,"Power - Long Press - Global Actions");showGlobalActionsInternal();break;
    void showGlobalActionsInternal() {if (mGlobalActions == null) {mGlobalActions = new GlobalActions(mContext, mWindowManagerFuncs);}final boolean keyguardShowing = isKeyguardShowingAndNotOccluded();mGlobalActions.showDialog(keyguardShowing, isDeviceProvisioned());// since it took two seconds of long press to bring this up,// poke the wake lock so they have some time to see the dialog.mPowerManager.userActivity(SystemClock.uptimeMillis(), false);
    }

    5.GlobalActions

  3. public void showDialog(boolean keyguardShowing, boolean deviceProvisioned) {if (DEBUG) Slog.d(TAG, "showDialog " + keyguardShowing + " " + deviceProvisioned);if (mGlobalActionsProvider != null && mGlobalActionsProvider.isGlobalActionsDisabled()) {return;}mKeyguardShowing = keyguardShowing;mDeviceProvisioned = deviceProvisioned;mShowing = true;if (mGlobalActionsAvailable) {mHandler.postDelayed(mShowTimeout, 5000);mGlobalActionsProvider.showGlobalActions();// mGlobalActionsProvider 就是 statusbarmanagerservice} else {// SysUI isn't alive, show legacy menu.ensureLegacyCreated();mLegacyGlobalActions.showDialog(mKeyguardShowing, mDeviceProvisioned);}
    }

6.StatusBarManagerService

StatusBarManagerService.java
@Override
public void showGlobalActions() {if (mBar != null) {try {// IStatusBar mBarmBar.showGlobalActionsMenu();} catch (RemoteException ex) {}}
}
@Override
public RegisterStatusBarResult registerStatusBar(IStatusBar bar) {enforceStatusBarService();Slog.i(TAG, "registerStatusBar bar=" + bar);mBar = bar;

7. statusbar (systemui)

RegisterStatusBarResult result = null;
try {
// protected IStatusBarService mBarService;
// mBarService = IStatusBarService.Stub.asInterface(
//        ServiceManager.getService(Context.STATUS_BAR_SERVICE));result = mBarService.registerStatusBar(mCommandQueue);
} catch (RemoteException ex) {ex.rethrowFromSystemServer();
}

8.commonqueue (systemui )

public class CommandQueue extends IStatusBar.Stub {@Override
public void showGlobalActionsMenu() {synchronized (mLock) {mHandler.removeMessages(MSG_SHOW_GLOBAL_ACTIONS);mHandler.obtainMessage(MSG_SHOW_GLOBAL_ACTIONS).sendToTarget();}
}
}
case MSG_SHOW_GLOBAL_ACTIONS:for (int i = 0; i < mCallbacks.size(); i++) {mCallbacks.get(i).handleShowGlobalActionsMenu();}break

9.GlobalActionsComponent.java

@Override
public void handleShowGlobalActionsMenu() {mStatusBarKeyguardViewManager.setGlobalActionsVisible(true);mExtension.get().showGlobalActions(this);
}

10. GlobalActionImpl

@Override
public void showGlobalActions(GlobalActionsManager manager) {if (mDisabled) return;mGlobalActionsDialog = mGlobalActionsDialogLazy.get();mGlobalActionsDialog.showOrHideDialog(mKeyguardStateController.isShowing(),mDeviceProvisionedController.isDeviceProvisioned());
}

11. GlobalActionDialogLite

就是 dialog 此后就不再分析

StatusBarManagerService 和 SystemUI 的 CommandQueue 进程间通信。

Power按键弹出关机界面流程相关推荐

  1. 锁屏时按power键不弹出关机界面

    前几天有个国外项目,有个需求是锁屏时按power键不能弹出关机界面. 之前没人改过这个,网上查也没有类似案例,然后只能一步一步跟代码了. 查阅相关的文章和翻代码,发现关机流程在PhoneWindowM ...

  2. android实现拨打电话但不弹出拨号界面

    这里只提供一个大概的思路,整个流程不是我一个人就能完成的.测试机型为htc one x,Android版本4.2.2,已ROOT. 要实现拨号程序可能很简单,一个简单的Intent就能实现,从发出意图 ...

  3. android 拨打电话但隐藏,android实现拨打电话但不弹出拨号界面

    这里只提供一个大概的思路,整个流程不是我一个人就能完成的.测试机型为htc one x,Android版本4.2.2,已ROOT. 要实现拨号程序可能很简单,一个简单的Intent就能实现,从发出意图 ...

  4. 关于VS打包程序无法弹出主界面的问题

    代码中的程序很正常,VS打包之后,无法弹出主界面的问题. 这种问题,一般是缺少程序加载所必须的东西,包括dll,配置文件等. (1)程序主界面使用的是DevExpress,DevExpress的相关类 ...

  5. oracle 无法弹出图形界面,Xshell 5 不能弹出GUI 图形界面问题

    https://www.cndba.cn/dave/article/1074 https://www.cndba.cn/dave/article/1074 刚从Xshell 4 换成了Xshell5, ...

  6. 完美解决xhost +报错: unable to open display 装oracle的时候总是在弹出安装界面的时候出错...

    详细很多朋友在装oracle的时候总是在弹出安装界面的时候出错,界面就是蹦不出来. oracle安装 先切换到root用户,执行xhost + 然后再切换到oracle用户,执行export DISP ...

  7. 第二十二篇玩转【斗鱼直播APP】系列之弹出房间界面

    弹出房间界面 功能说明 区分弹出秀场&普通房间 如果用户是秀场直播,那么弹出秀场房间界面 如果用户是电脑直播,那么弹出普通房间界面 秀场界面弹出 直接以Model方式,从底部弹出即可 普通界面 ...

  8. 小码哥-斗鱼直播APP之弹出房间界面

    弹出房间界面 功能说明 区分弹出秀场&普通房间 如果用户是秀场直播,那么弹出秀场房间界面 如果用户是电脑直播,那么弹出普通房间界面 秀场界面弹出 直接以Model方式,从底部弹出即可 普通界面 ...

  9. Qt_UI_vs建工程双击ui文件没有弹出设计界面

    文章目录 1. 环境 2. 问题原因 3. 创建工程 1. 环境 [Visual Studio]: 镜像包:VS2010UltimTrial.isoservice pack补丁:cn_visual_s ...

最新文章

  1. 线程的常用方法——currentThread方法||在main方法中直接调用run()方法,没有开启新的线程,以在run方法中的当前线程就是main线程||启动子线程,子线程会调用run方法
  2. FreeRTOS系列第2篇---FreeRTOS入门指南
  3. Vue 使用 screenfull 实现全屏
  4. [转]Eclipse下的JavaScript编辑器中文无法保存问题解决
  5. C#| 使用String.Format()方法将小数点前的数字四舍五入
  6. oracle中执行自带脚本,oracle自带脚本
  7. C语言宏定义中#define中的井号#的使用
  8. android ble 经典蓝牙,Android 经典蓝牙(Classic Bluetooth)和低功耗蓝牙(BLE)
  9. CodeForces - 786B Legacy (线段树+DIjkstra+思维)
  10. PHPStorm常用快捷方式
  11. 智伴机器人班尼怎么联网_智伴机器人官网
  12. 中国电信物联网平台入门学习笔记6:电信平台数据模拟采集
  13. 531 孤独像素 I
  14. 在线教育需要准备好哪些直播设备?
  15. 高通量数据中批次效应的鉴定和处理 - 系列总结和更新
  16. iOS-事件响应链、单例模式、工厂模式、观察者模式
  17. Linux下的FTP安装和登录
  18. 联想台式机计算机接口,如果不能使用Lenovo台式计算机的USB接口怎么办
  19. GoogleTest使用教程
  20. 香港科技大学陈浩教授招收AI全奖博士

热门文章

  1. html表格居中设置css样式,css怎么设置table居中?
  2. 利用js实现等腰三角形
  3. 支付宝的迂回术:再次借元宵节口令红包,阻击微信
  4. MC/DC(修正条件/判定覆盖):如何达到100%覆盖率?
  5. 《功夫熊猫》之经典台词~~,欢迎大家一起添加
  6. 如何下载北辰区卫星地图高清版大图?
  7. 从传统框架到服务化框架
  8. 最经典的解释---中国足球怎么老输
  9. html dom getattribute,DOM Element对象getAttribute()方法
  10. es6--模块化开发