当前位置: 首页 > backend >正文

Android14关机流程

1. 长按power键的弹框界面
frameworks\base\services\core\java\com\android\server\policy\PhoneWindowManager.java

private void powerLongPress(long eventTime) {final int behavior = getResolvedLongPressOnPowerBehavior();Slog.d(TAG, "powerLongPress: eventTime=" + eventTime+ " mLongPressOnPowerBehavior=" + mLongPressOnPowerBehavior);switch (behavior) {case LONG_PRESS_POWER_NOTHING:break;case LONG_PRESS_POWER_GLOBAL_ACTIONS: //长按powermPowerKeyHandled = true;performHapticFeedback(HapticFeedbackConstants.LONG_PRESS_POWER_BUTTON, false,"Power - Long Press - Global Actions");showGlobalActions(); //这里调用break;.......@Overridepublic void showGlobalActions() {mHandler.removeMessages(MSG_DISPATCH_SHOW_GLOBAL_ACTIONS);mHandler.sendEmptyMessage(MSG_DISPATCH_SHOW_GLOBAL_ACTIONS);}void showGlobalActionsInternal() {if (mGlobalActions == null) {mGlobalActions = mGlobalActionsFactory.get();}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);}

frameworks\base\services\core\java\com\android\server\policy\GlobalActions.java

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();//这里调用} else {// SysUI isn't alive, show legacy menu.ensureLegacyCreated();mLegacyGlobalActions.showDialog(mKeyguardShowing, mDeviceProvisioned);}}

frameworks\base\services\core\java\com\android\server\statusbar\StatusBarManagerService.java

    private volatile IStatusBar mBar;private final GlobalActionsProvider mGlobalActionsProvider = new GlobalActionsProvider() {@Overridepublic boolean isGlobalActionsDisabled() {// TODO(b/118592525): support global actions for multi-display.final int disabled2 = mDisplayUiState.get(DEFAULT_DISPLAY).getDisabled2();return (disabled2 & DISABLE2_GLOBAL_ACTIONS) != 0;}@Overridepublic void setGlobalActionsListener(GlobalActionsProvider.GlobalActionsListener listener) {mGlobalActionListener = listener;mGlobalActionListener.onGlobalActionsAvailableChanged(mBar != null);}@Overridepublic void showGlobalActions() {if (mBar != null) {try {mBar.showGlobalActionsMenu();//这里调用} catch (RemoteException ex) {}}}};

SystemUI/src/com/android/systemui/statusbar/CommandQueue.java

    @Overridepublic void showGlobalActionsMenu() {synchronized (mLock) {mHandler.removeMessages(MSG_SHOW_GLOBAL_ACTIONS);mHandler.obtainMessage(MSG_SHOW_GLOBAL_ACTIONS).sendToTarget();}}

SystemUI/src/com/android/systemui/globalactions/GlobalActionsComponent.java

    private Extension<GlobalActions> mExtension;@Overridepublic void handleShowGlobalActionsMenu() {mStatusBarKeyguardViewManager.setGlobalActionsVisible(true);mExtension.get().showGlobalActions(this);}

接口

SystemUI\src\com\android\systemui\globalactions\GlobalActionsImpl.java

public class GlobalActionsImpl implements GlobalActions, CommandQueue.Callbacks {@Overridepublic void showGlobalActions(GlobalActionsManager manager) {if (mDisabled) return;//这里调用GlobalActionsDialogLite的showOrHideDialog方法mGlobalActionsDialog.showOrHideDialog(mKeyguardStateController.isShowing(),mDeviceProvisionedController.isDeviceProvisioned(), null /* view */);}

frameworks\base\packages\SystemUI\src\com\android\systemui\globalactions\GlobalActionsDialogLite.java

    public void showOrHideDialog(boolean keyguardShowing, boolean isDeviceProvisioned,@Nullable Expandable expandable) {mKeyguardShowing = keyguardShowing;mDeviceProvisioned = isDeviceProvisioned;if (mDialog != null && mDialog.isShowing()) {// In order to force global actions to hide on the same affordance press, we must// register a call to onGlobalActionsShown() first to prevent the default actions// menu from showing. This will be followed by a subsequent call to// onGlobalActionsHidden() on dismiss()mWindowManagerFuncs.onGlobalActionsShown();mDialog.dismiss();mDialog = null;} else {handleShow(expandable);//这里显示弹框}}@VisibleForTestingprotected void createActionItems() {// Simple toggle style if there's no vibrator, otherwise use a tri-stateif (!mHasVibrator) {mSilentModeAction = new SilentModeToggleAction()
http://www.xdnf.cn/news/14250.html

相关文章:

  • web方向第一次考核内容
  • [每周一更]-(第145期):分表数据扩容处理:原理与实战
  • Git常用命令摘要
  • 智能集运重塑反向海淘:系统破解物流困局
  • HarmonyOS 5鸿蒙多端编译实战:从Android/iOS到HarmonyOS 5 的跨端迁移指南详
  • 【论文阅读】Multi-Class Cell Detection Using Spatial Context Representation
  • SparkUI依赖问题解决方法
  • React 性能优化实战指南:从理论到实践的完整攻略
  • Linux--磁盘寻址:从 CHS 到 LBA 的深度解码之旅
  • 深度解析Java泛型:从原理到实战应用
  • 大模型在颈椎管狭窄诊疗中的应用研究报告
  • MySQL 调优笔记
  • 嵌入式系统内核镜像相关(五)
  • 33-Oracle Parallel 并行处理的选择和实践
  • 【论文阅读34】Attention-ResNet-LSTM(JRMGE2024)
  • 移动开发中边框1px的问题
  • AJAX——前后端传输数据场景下使用的技术
  • java设计模式[2]之创建型模式
  • 【无标题】【2025年软考中级】第三章数据结构3.2 栈与队列
  • 【0.0 漫画C语言计算机基础 - 从二进制开始认识计算机】
  • 纯 CSS 实现的的3种扫光效果
  • 记录lxml中的etree、xpath来定位、爬取元素
  • 清理 Docker 容器日志文件方法
  • YOLOv3 训练与推理流程详解-结合真实的数据样例进行模拟
  • 19.vue.js的style的lang=scss、less(2)
  • 荒原之梦:致力于考研数学实战
  • 大模型——Dify 与 Browser-use 结合使用
  • Spring AI Alibaba Graph 实践
  • 简历模板2——数据挖掘工程师5年经验
  • DataX Hive写插件深度解析:从数据写入到Hive表关联实战