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();
}
备注:此文旨在记录分析过程
以上分析属于笔者自己理解如果有错误请大神指出,欢迎转载