frameworks开发笔记之关机流程

匿名 (未验证) 提交于 2019-12-03 00:30:01

关机的核心类

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方法:


            
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!