关机的核心类
frameworks\base\services\core\java\com\android\server\power\PowerManagerService.java frameworks\base\services\core\java\com\android\server\MountService.java frameworks\base\services\core\java\com\android\server\power\ShutdownThread.java
关机流程图
关机源码详解
frameworks\base\services\core\java\com\android\server\power\PowerManagerService.java
reboot和shutdown方法启动关机:
shutdownOrRebootInternal(HALT_MODE_SHUTDOWN, confirm, reason, wait);
shutdownOrRebootInternal(HALT_MODE_REBOOT, confirm, reason, wait);
shutdownOrRebootInternal方法调用ShutdownThread.shutdown:
ShutdownThread.shutdown调用了shutdownInner方法:
shutdownInner方法显示关机确认对话框,点击关机调用方法beginShutdownSequence:
private static void shutdownInner(final Context context, boolean confirm) { ...... if (confirm) { final CloseDialogReceiver closer = new CloseDialogReceiver(context); if (sConfirmDialog != null) { sConfirmDialog.dismiss(); } sConfirmDialog = new AlertDialog.Builder(context) .setTitle(mRebootSafeMode ? com.android.internal.R.string.reboot_safemode_title : com.android.internal.R.string.power_off) .setMessage(resourceId) .setPositiveButton(com.android.internal.R.string.yes, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { beginShutdownSequence(context); } }) .setNegativeButton(com.android.internal.R.string.no, null) .create(); closer.dialog = sConfirmDialog; sConfirmDialog.setOnDismissListener(closer); sConfirmDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG); sConfirmDialog.show(); } else { beginShutdownSequence(context); } }
beginShutdownSequence方法使cpu不再睡眠,使屏幕显示为亮,启动初始化关机线程:
private static void beginShutdownSequence(Context context) { ...... // make sure we never fall asleep again sInstance.mCpuWakeLock = null; try { sInstance.mCpuWakeLock = sInstance.mPowerManager.newWakeLock( PowerManager.PARTIAL_WAKE_LOCK, TAG + "-cpu"); sInstance.mCpuWakeLock.setReferenceCounted(false); sInstance.mCpuWakeLock.acquire(); } catch (SecurityException e) { Log.w(TAG, "No permission to acquire wake lock", e); sInstance.mCpuWakeLock = null; } // also make sure the screen stays on for better user experience sInstance.mScreenWakeLock = null; if (sInstance.mPowerManager.isScreenOn()) { try { sInstance.mScreenWakeLock = sInstance.mPowerManager.newWakeLock( PowerManager.FULL_WAKE_LOCK, TAG + "-screen"); sInstance.mScreenWakeLock.setReferenceCounted(false); sInstance.mScreenWakeLock.acquire(); } catch (SecurityException e) { Log.w(TAG, "No permission to acquire wake lock", e); sInstance.mScreenWakeLock = null; } } // start the thread that initiates shutdown sInstance.mHandler = new Handler() { }; sInstance.start(); }
再执行run方法:
文章来源: frameworks开发笔记之关机流程