Android关机流程简析

本文详细介绍了Android系统关机的整个流程,从电源按键响应到系统服务关闭,再到底层系统的操作,包括发送关机广播、关闭服务、电源管理服务调用,以及在关机过程中对SD卡的处理,如卸载SD卡和处理占用SD卡的进程。此外,还讨论了关机时的振动反馈和内核关机过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关机有几种方式:按键、重启或者其他模式

在关机过程中,主要做了三件事:
1.发送关机广播
2.关闭一些主要服务进程
3.通过PowerManagerService调用底层进行关机
有的模块可能需要监听手机关机事件,所以在关机时发送关机广播,通知相关模块处理。


接下来主要讲解按键响应关机整个流程:

PhoneWindowManager.java | framework\base\services\core\java\com\android\server\policy

    private void interceptPowerKeyDown(KeyEvent event, boolean interactive) {
        // Hold a wake lock until the power key is released.
        if (!mPowerKeyWakeLock.isHeld()) {
            mPowerKeyWakeLock.acquire();
        }
        ......
         if (hasLongPressOnPowerBehavior()) {//是否存在长按事件
                    Message msg = mHandler.obtainMessage(MSG_POWER_LONG_PRESS);
                    msg.setAsynchronous(true);//如果是长按power键就发送MSG_POWER_LONG_PRESS
                    mHandler.sendMessageDelayed(msg,//发送delay消息, delay 500ms给用户一些时间长按power键显示关机dialog, 同时delay时间也可以通过config.xml中配置

                    ViewConfiguration.get(mContext).getDeviceGlobalActionKeyTimeout());
                }
        ......
    }

延迟消息最终会在PolicyHandler的handleMessage中处理长按事件。

private class PolicyHandler extends Handler {
        @Override
        public void handleMessage(Message msg) {
              //......
                case MSG_POWER_LONG_PRESS:
                    powerLongPress();//处理长按事件
                    break;
           //........
            }
        }
    }

当按下电源按键的时候会有不同的响应,可能什么都不做,也可能直接关机,没有给用户任何提醒. 或者弹出dialog让用户自己选择. 下面将主要讲解弹出dialog关机的情况。

GlobalActions.java | framework\base\services\core\java\com\android\server\policy

static final int LONG_PRESS_POWER_NOTHING = 0;       //长按power键什么都不做
    static final int LONG_PRESS_POWER_GLOBAL_ACTIONS = 1;     //为全局动作, 显示关机dialog
    static final int LONG_PRESS_POWER_SHUT_OFF = 2;    //只有关机一个选项
    static final int LONG_PRESS_POWER_SHUT_OFF_NO_CONFIRM = 3;   //直接关机不用确认
    
    private void powerLongPress() {
        final int behavior = getResolvedLongPressOnPowerBehavior();
        switch (behavior) {
        case LONG_PRESS_POWER_NOTHING://什么都不做,返回
            break;
        case LONG_PRESS_POWER_GLOBAL_ACTIONS:
            mPowerKeyHandled = true;
            if (!performHapticFeedbackLw(null, HapticFeedbackConstants.LONG_PRESS, false)) {
                performAuditoryFeedbackForAccessibilityIfNeed();
            }
			showGlobalActionsInternal();//shutDownRing();//显示全局Dailog
            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(behavior == LONG_PRESS_POWER_SHUT_OFF);
            break;
        }
    }

延伸:

可以在调用showGlobalActionsInternal()方法显示全局Dailog之前做一些定制化处理,比如随机播放关机铃声,如shutDownRing()方法:

private void shutDownRing(){
		//Merged by lefty.lan @20180803 for shutdown_ring, start
		Random random = new Random();
		int num = random.nextInt(4)%(4-1+1) + 1;
		MediaPlayer mPlayer = new MediaPlayer();
		try {
			if(mPlayer != null){
				switch (num) {
			    case 1:
					mPlayer.setDataSource("/system/media/01.wav");
					break;
				case 2:
					mPlayer.setDataSource("/system/media/02.wav");
					break;
				case 3:
					mPlayer.setDataSource("/system/media/03.wav");
					break;
				case 4:
					
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值