Android(安卓)4.1.2系统添加重启功能
16lz
2021-01-24
对于Android的的手机或者平板长期使用,感觉会出现慢的情况,所以偶尔还是需要重启一下,而长按电源键弹出的菜单又没有重启选项,所以特在此记录自己添加这个功能的过程。
首先关机的那个弹出菜单是在frameworks/base/policy/src/com/android/internal/policy/impl/GlobalActions.java这个文件中创建的:
首先在frameworks/base/core/java/android/view/WindowManagerPolicy.java中添加reboot接口:
首先关机的那个弹出菜单是在frameworks/base/policy/src/com/android/internal/policy/impl/GlobalActions.java这个文件中创建的:
点击(此处)折叠或打开
- /**
- * Create the global actions dialog.
- * @return A new dialog.
- */
- privateGlobalActionsDialogcreateDialog(){
- // Simple toggle style if there's no vibrator, otherwise use a tri-state
- if(!mHasVibrator){
- mSilentModeAction=newSilentModeToggleAction();
- }else{
- mSilentModeAction=newSilentModeTriStateAction(mContext,mAudioManager,mHandler);
- }
- mAirplaneModeOn=newToggleAction(
- R.drawable.ic_lock_airplane_mode,
- R.drawable.ic_lock_airplane_mode_off,
- R.string.global_actions_toggle_airplane_mode,
- R.string.global_actions_airplane_mode_on_status,
- R.string.global_actions_airplane_mode_off_status){
-
- voidonToggle(booleanon){
- if(mHasTelephony&&Boolean.parseBoolean(
- SystemProperties.get(TelephonyProperties.PROPERTY_INECM_MODE))){
- mIsWaitingForEcmExit=true;
- // Launch ECM exit dialog
- Intent ecmDialogIntent=
- newIntent(TelephonyIntents.ACTION_SHOW_NOTICE_ECM_BLOCK_OTHERS,null);
- ecmDialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- mContext.startActivity(ecmDialogIntent);
- }else{
- changeAirplaneModeSystemSetting(on);
- }
- }
-
- @Override
- protectedvoidchangeStateFromPress(booleanbuttonOn){
- if(!mHasTelephony)return;
-
- // In ECM mode airplane state cannot be changed
- if(!(Boolean.parseBoolean(
- SystemProperties.get(TelephonyProperties.PROPERTY_INECM_MODE)))){
- mState=buttonOn?State.TurningOn:State.TurningOff;
- mAirplaneState=mState;
- }
- }
-
- publicbooleanshowDuringKeyguard(){
- returntrue;
- }
-
- publicbooleanshowBeforeProvisioning(){
- returnfalse;
- }
- };
- onAirplaneModeChanged();
-
- mItems=newArrayList<Action>();
-
- // first: power off
- mItems.add(
- newSinglePressAction(
- com.android.internal.R.drawable.ic_lock_power_off,
- R.string.global_action_power_off){
-
- publicvoidonPress(){
- // shutdown by making sure radio and power are handled accordingly.
- mWindowManagerFuncs.shutdown(true);
- }
-
- publicbooleanonLongPress(){
- mWindowManagerFuncs.rebootSafeMode(true);
- returntrue;
- }
-
- publicbooleanshowDuringKeyguard(){
- returntrue;
- }
-
- publicbooleanshowBeforeProvisioning(){
- returntrue;
- }
- });
- mItems.add(
- newSinglePressAction(
- com.android.internal.R.drawable.ic_lock_power_off,
- R.string.global_action_reboot){
-
- publicvoidonPress(){
- // reboot
- mWindowManagerFuncs.reboot();
- }
-
- publicbooleanshowDuringKeyguard(){
- returntrue;
- }
-
- publicbooleanshowBeforeProvisioning(){
- returntrue;
- }
- });
首先在frameworks/base/core/java/android/view/WindowManagerPolicy.java中添加reboot接口:
- /**
- * Interface for calling back in to the window manager that is private
- * between it and the policy.
- */
- publicinterfaceWindowManagerFuncs{
-
- ...
-
- /**
- * Switch the keyboard layout for the given device.
- * Direction should be +1 or -1 to go to the next or previous keyboard layout.
- */
- publicvoidswitchKeyboardLayout(intdeviceId,intdirection);
-
- publicvoidshutdown();
- publicvoidreboot();
- publicvoidrebootSafeMode();
- }
- // Called by window manager policy. Not exposed externally.
- @Override
- publicvoidshutdown(){
- ShutdownThread.shutdown(mContext,true);
- }
-
- // Called by window manager policy. Not exposed externally.
- @Override
- publicvoidreboot(){
- ShutdownThread.reboot(mContext,null,true);
- }
-
- // Called by window manager policy. Not exposed externally.
- @Override
- publicvoidrebootSafeMode(){
- ShutdownThread.rebootSafeMode(mContext,true);
- }
- staticvoidshutdownInner(finalContextcontext,booleanconfirm){
- // ensure that only one thread is trying to power down.
- // any additional calls are just returned
- synchronized(sIsStartedGuard){
- if(sIsStarted){
- Log.d(TAG,"Request to shutdown already running, returning.");
- return;
- }
- }
-
- finalintlongPressBehavior=context.getResources().getInteger(
- com.android.internal.R.integer.config_longPressOnPowerBehavior);
- finalintresourceId=mRebootSafeMode
- ?com.android.internal.R.string.reboot_safemode_confirm
- :(longPressBehavior==2
- ?com.android.internal.R.string.shutdown_confirm_question
- :(mReboot?com.android.internal.R.string.reboot_confirm:
- com.android.internal.R.string.shutdown_confirm));
-
- Log.d(TAG,"Notifying thread to start shutdown longPressBehavior="+longPressBehavior);
-
- if(confirm){
- finalCloseDialogReceiver closer=newCloseDialogReceiver(context);
- finalAlertDialogdialog=newAlertDialog.Builder(context)
- .setTitle(mRebootSafeMode
- ?com.android.internal.R.string.reboot_safemode_title
- :(mReboot?com.android.internal.R.string.reboot:
- com.android.internal.R.string.power_off))
- .setMessage(resourceId)
- .setPositiveButton(com.android.internal.R.string.yes,newDialogInterface.OnClickListener(){
- publicvoidonClick(DialogInterfacedialog,intwhich){
- beginShutdownSequence(context);
- }
- })
- .setNegativeButton(com.android.internal.R.string.no,null)
- .create();
- closer.dialog=dialog;
- dialog.setOnDismissListener(closer);
- dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
- dialog.show();
- }else{
- beginShutdownSequence(context);
- }
- }
-
- privatestaticvoidbeginShutdownSequence(Contextcontext){
- synchronized(sIsStartedGuard){
- if(sIsStarted){
- Log.d(TAG,"Shutdown sequence already running, returning.");
- return;
- }
- sIsStarted=true;
- }
-
- // throw up an indeterminate system dialog to indicate radio is
- // shutting down.
- ProgressDialog pd=newProgressDialog(context);
- pd.setTitle(context.getText(com.android.internal.R.string.power_off));
- pd.setMessage(context.getText(com.android.internal.R.string.shutdown_progress));
- pd.setIndeterminate(true);
- pd.setCancelable(false);
- pd.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
-
- pd.show();
-
- sInstance.mContext=context;
- sInstance.mPowerManager=(PowerManager)context.getSystemService(Context.POWER_SERVICE);
-
- // 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(SecurityExceptione){
- 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(SecurityExceptione){
- Log.w(TAG,"No permission to acquire wake lock",e);
- sInstance.mScreenWakeLock=null;
- }
- }
-
- // start the thread that initiates shutdown
- sInstance.mHandler=newHandler(){
- };
- sInstance.start();
- }
- <string name="reboot">Reboot</string>
- <string name="reboot_progress">Reboot\u2026</string>
- <string name="reboot_confirm"product="tablet">Your tablet will reboot.</string>
- <string name="reboot_confirm"product="default">Your phone will reboot.</string>
- <!-- label for item that reboot in phone options dialog -->
- <string name="global_action_reboot">Reboot</string>
- <java-symbol type="string"name="reboot"/>
- <java-symbol type="string"name="reboot_confirm"/>
- <java-symbol type="string"name="reboot_progress"/>
- <java-symbol type="string"name="global_action_reboot"/>
更多相关文章
- C语言函数的递归(上)
- Android(安卓)NDK环境搭建和开发入门
- 观摩Android最高权力的Context通用性接口
- Android(安卓)aar打包及引用
- Vitamio打造android个性化得播放器
- 【入门篇】Android学习笔记——项目结构及相关基础知识
- Android世界的Swift - Kotlin语言
- Android安装NDK运行环境无需cygwin
- android Qemu GPS 模块简明分析