shutdown thread.java_【 Android 10 系统启动 】系列 -- ShutdownThread(关机流程)

本文详细介绍了Android系统关机流程,从用户按下电源键开始,经过PhoneWindowManager的处理,触发powerLongPress()方法,调用showGlobalActionsInternal()显示全局操作对话框。在用户确认关机后,ShutdownThread负责执行实际的关机操作,包括发送广播、关闭服务等。最后,ShutdownThread的rebootOrShutdown()方法决定系统是关机还是重启。
摘要由CSDN通过智能技术生成

前言

由于源码分析的代码量比较大,大部分博客网站的内容显示页面都比较窄,显示出来的效果都异常丑陋,所以您也可以直接查看 《 Thinking in Android 》 来阅读这边文章,希望这篇文章能帮你梳理清楚 “Android 关机流程”。

核心源码

关键类

路径

GlobalActions.java

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

LegacyGlobalActions.java

frameworks/base/services/core/java/com/android/server/policy/LegacyGlobalActions.java

PhoneWindowManager.java

frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java

PowerManagerService.java

frameworks/base/services/core/java/com/android/server/power/PowerManagerService.java

ShutdownThread.java

frameworks/base/services/core/java/com/android/server/power/ShutdownThread.java

WindowManagerService.java

frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java

一、PhoneWindowManager

Android 系统的关机流程是从用户按 power 键开始的,所有的按键处理都是通过 PhoneWindowManager.interceptKeyBeforeQueueing() 方法进行处理。

2.1 PhoneWindowManager.interceptKeyBeforeQueueing()

// frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java

public class PhoneWindowManager implements WindowManagerPolicy {

@Override

public int interceptKeyBeforeQueueing(KeyEvent event, int policyFlags) {

... ...

// Handle special keys.

switch (keyCode) {

... ...

case KeyEvent.KEYCODE_POWER: {

EventLogTags.writeInterceptPower(

KeyEvent.actionToString(event.getAction()),

mPowerKeyHandled ? 1 : 0, mPowerKeyPressCounter);

// Any activity on the power button stops the accessibility shortcut

cancelPendingAccessibilityShortcutAction();

result &= ~ACTION_PASS_TO_USER;

isWakeKey = false; // wake-up will be handled separately

if (down) {

// down 为 true,代表按下 power 键,走 interceptPowerKeyDown() 方法

interceptPowerKeyDown(event, interactive);

} else {

interceptPowerKeyUp(event, interactive, canceled);

}

break;

}

... ...

}

}

2.2 PhoneWindowManager.interceptPowerKeyDown()

// frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java

public class PhoneWindowManager implements WindowManagerPolicy {

private void interceptPowerKeyDown(KeyEvent event, boolean interactive) {

... ...

// 截屏功能

if (interactive && !mScreenshotChordPowerKeyTriggered

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

mScreenshotChordPowerKeyTriggered = true;

mScreenshotChordPowerKeyTime = event.getDownTime();

interceptScreenshotChord();

interceptRingerToggleChord();

}

TelecomManager telecomManager = getTelecommService();

boolean hungUp = false;

if (telecomManager != null) {

if (telecomManager.isRinging()) {

telecomManager.silenceRinger(); // 如果来电时,按 Power 则静音

} else if ((mIncallPowerBehavior

& Settings.Secure.INCALL_POWER_BUTTON_BEHAVIOR_HANGUP) != 0

&& telecomManager.isInCall() && interactive) {

hungUp = telecomManager.endCall();

}

}

... ...

mPowerKeyHandled = hungUp || mScreenshotChordVolumeDownKeyTriggered

|| mA11yShortcutChordVolumeUpKeyTriggered || gesturedServiceIntercepted;

if (!mPowerKeyHandled) {

if (interactive) {

if (hasLongPressOnPowerBehavior()) {

if ((event.getFlags() & Ke

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值