Android TV关机Framework代码分析(MTK 4.4 非STR)

Android TV关机分析

PhoneWindowManager

  • 接收遥控器按键
//frameworks\base\policy\src\com\android\internal\policy\impl\PhoneWindowManager.java
@Override
    public int interceptKeyBeforeQueueing(KeyEvent event, int policyFlags, boolean isScreenOn) {
    .....//省略无关代码
    case KeyEvent.KEYCODE_POWER: {
    	...
    	//处理power按键
    	interceptPowerKeyDown(!isScreenOn || hungUp
								|| mVolumeDownKeyTriggered || mVolumeUpKeyTriggered);
    	...
    }
}
  • 待机按键处理
//frameworks\base\policy\src\com\android\internal\policy\impl\PhoneWindowManager.java
private void interceptPowerKeyDown(boolean handled) {
        mPowerKeyHandled = handled;
        if (enable_str == false) {
            if (!handled) {
            	//通过mPowerLongPress处理
                mHandler.postDelayed(mPowerLongPress, ViewConfiguration.getGlobalActionKeyTimeout());
            }
        }
    }

如果power按键没被处理且未开启str,则使用mHandler发送延时消息,这里可以处理待机键长按的情况

  • Handler处理
//frameworks\base\policy\src\com\android\internal\policy\impl\PhoneWindowManager.java
private final Runnable mPowerLongPress = new Runnable() {
        @Override
        public void run() {
           ...//省略无关代码
            if (FactoryTest.isLongPressOnPowerOffEnabled()) {
                resolvedBehavior = LONG_PRESS_POWER_SHUT_OFF_NO_CONFIRM;
            }

            switch (resolvedBehavior) {
           	...//省略无关代码
            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(resolvedBehavior == LONG_PRESS_POWER_SHUT_OFF);
                break;
            	....//省略无关代码
            }
        }
    };

调用 mWindowManagerFuncs.shutdown(resolvedBehavior == LONG_PRESS_POWER_SHUT_OFF);接口进行待机

@Override
    public void init(Context context, IWindowManager windowManager,
            WindowManagerFuncs windowManagerFuncs) {
        mContext = context;
        mWindowManager = windowManager;
        //mWindowManagerFuncs实际上为WindowManagerService,实现了WindowManagerPolicy.WindowManagerFuncs接口。
        mWindowManagerFuncs = windowManagerFuncs;
    }

WindowManagerService分析

  • 代码位置:\frameworks\base\services\java\com\android\server\wm\WindowManagerService.java
 // Called by window manager policy.  Not exposed externally.
    @Override
    public void shutdown(boolean confirm) {
        ShutdownThread.shutdown(mContext, confirm);
    }

调用ShutdownThread待机接口

ShutdownThread分析

  • 代码位置:\frameworks\base\services\java\com\android\server\power\ShutdownThread.java
public static void shutdown(final Context context, boolean confirm) {
        mReboot = false;
        mRebootSafeMode = false;
        shutdownInner(context, confirm);
}
static void shutdownInner(final Context context, boolean confirm) {
       //省略无关代码
       beginShutdownSequence(context);
       //省略无关代码
}
private static void beginShutdownSequence(Context context) {
        //省略无关代码
        //sInstance 为 ShutdownThread 对象
        sInstance.mContext = context;
        sInstance.mPowerManager = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
        //省略无关代码
        sInstance.mHandler = new Handler() {
        };
        //ShutdownThread 线程启动,调用run()函数
        sInstance.start();
    }
public void run() {
      	//省略无关代码
      	//处理重启/关机
        rebootOrShutdown(mReboot, mRebootReason);
}

public static void rebootOrShutdown(boolean reboot, String reason) {
		...
        // Shutdown power
        Log.i(TAG, "Performing low-level shutdown...");
        //调用PowerManagerService接口关机
        PowerManagerService.lowLevelShutdown();
}

PowerManagerService分析

  • 代码位置:\frameworks\base\services\java\com\android\server\power\PowerManagerService.java
public static void lowLevelShutdown() {
	//调用native接口关机(拉低/拉高GPIO)
	//省略无关代码
    nativeShutdown();
}
备注:此文旨在记录分析过程

以上分析属于笔者自己理解如果有错误请大神指出,欢迎转载

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值