Power按键弹出关机界面流程
按键事件分发
关机流程: ViewRootImpl -> PhoneWindowManager -> GlobalAction -> StatusBarManagerService -> commandQueue -> GlobalActionImpl
dispatchUnhandledKey -> interceptFallback -> interceptKeyBeforeQueueing
按键的时间源头: InputDispatcher.cpp 参考文章
底层从eventhub事件传递看一下文章。
Android输入系统(三)——InputReader的加工类型和InputDispatcher的分发过程(基于Android 13)_一切皆是定数的博客-CSDN博客
1. InputDispatcherFactory.cpp
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
InputDispatcher.cpp InputDispatcher::InputDispatcher(const sp<InputDispatcherPolicyInterface>& policy): mPolicy(policy),
3. InputManagerService.java
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
// 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
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按键弹出关机界面流程相关推荐
- 锁屏时按power键不弹出关机界面
前几天有个国外项目,有个需求是锁屏时按power键不能弹出关机界面. 之前没人改过这个,网上查也没有类似案例,然后只能一步一步跟代码了. 查阅相关的文章和翻代码,发现关机流程在PhoneWindowM ...
- android实现拨打电话但不弹出拨号界面
这里只提供一个大概的思路,整个流程不是我一个人就能完成的.测试机型为htc one x,Android版本4.2.2,已ROOT. 要实现拨号程序可能很简单,一个简单的Intent就能实现,从发出意图 ...
- android 拨打电话但隐藏,android实现拨打电话但不弹出拨号界面
这里只提供一个大概的思路,整个流程不是我一个人就能完成的.测试机型为htc one x,Android版本4.2.2,已ROOT. 要实现拨号程序可能很简单,一个简单的Intent就能实现,从发出意图 ...
- 关于VS打包程序无法弹出主界面的问题
代码中的程序很正常,VS打包之后,无法弹出主界面的问题. 这种问题,一般是缺少程序加载所必须的东西,包括dll,配置文件等. (1)程序主界面使用的是DevExpress,DevExpress的相关类 ...
- oracle 无法弹出图形界面,Xshell 5 不能弹出GUI 图形界面问题
https://www.cndba.cn/dave/article/1074 https://www.cndba.cn/dave/article/1074 刚从Xshell 4 换成了Xshell5, ...
- 完美解决xhost +报错: unable to open display 装oracle的时候总是在弹出安装界面的时候出错...
详细很多朋友在装oracle的时候总是在弹出安装界面的时候出错,界面就是蹦不出来. oracle安装 先切换到root用户,执行xhost + 然后再切换到oracle用户,执行export DISP ...
- 第二十二篇玩转【斗鱼直播APP】系列之弹出房间界面
弹出房间界面 功能说明 区分弹出秀场&普通房间 如果用户是秀场直播,那么弹出秀场房间界面 如果用户是电脑直播,那么弹出普通房间界面 秀场界面弹出 直接以Model方式,从底部弹出即可 普通界面 ...
- 小码哥-斗鱼直播APP之弹出房间界面
弹出房间界面 功能说明 区分弹出秀场&普通房间 如果用户是秀场直播,那么弹出秀场房间界面 如果用户是电脑直播,那么弹出普通房间界面 秀场界面弹出 直接以Model方式,从底部弹出即可 普通界面 ...
- Qt_UI_vs建工程双击ui文件没有弹出设计界面
文章目录 1. 环境 2. 问题原因 3. 创建工程 1. 环境 [Visual Studio]: 镜像包:VS2010UltimTrial.isoservice pack补丁:cn_visual_s ...
最新文章
- 线程的常用方法——currentThread方法||在main方法中直接调用run()方法,没有开启新的线程,以在run方法中的当前线程就是main线程||启动子线程,子线程会调用run方法
- FreeRTOS系列第2篇---FreeRTOS入门指南
- Vue 使用 screenfull 实现全屏
- [转]Eclipse下的JavaScript编辑器中文无法保存问题解决
- C#| 使用String.Format()方法将小数点前的数字四舍五入
- oracle中执行自带脚本,oracle自带脚本
- C语言宏定义中#define中的井号#的使用
- android ble 经典蓝牙,Android 经典蓝牙(Classic Bluetooth)和低功耗蓝牙(BLE)
- CodeForces - 786B Legacy (线段树+DIjkstra+思维)
- PHPStorm常用快捷方式
- 智伴机器人班尼怎么联网_智伴机器人官网
- 中国电信物联网平台入门学习笔记6:电信平台数据模拟采集
- 531 孤独像素 I
- 在线教育需要准备好哪些直播设备?
- 高通量数据中批次效应的鉴定和处理 - 系列总结和更新
- iOS-事件响应链、单例模式、工厂模式、观察者模式
- Linux下的FTP安装和登录
- 联想台式机计算机接口,如果不能使用Lenovo台式计算机的USB接口怎么办
- GoogleTest使用教程
- 香港科技大学陈浩教授招收AI全奖博士