Android 4.1.2系统添加重启功能
生活随笔
收集整理的這篇文章主要介紹了
Android 4.1.2系统添加重启功能
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
對(duì)于Android的的手機(jī)或者平板長(zhǎng)期使用,感覺(jué)會(huì)出現(xiàn)慢的情況,所以偶爾還是需要重啟一下,而長(zhǎng)按電源鍵彈出的菜單又沒(méi)有重啟選項(xiàng),所以特在此記錄自己添加這個(gè)功能的過(guò)程。
首先關(guān)機(jī)的那個(gè)彈出菜單是在frameworks/base/policy/src/com/android/internal/policy/impl/GlobalActions.java這個(gè)文件中創(chuàng)建的:
/**
?* Create the global actions dialog.
?* @return A new dialog.
?*/
private?GlobalActionsDialog?createDialog()?{
????// Simple toggle style if there's no vibrator, otherwise use a tri-state
????if?(!mHasVibrator)?{
????????mSilentModeAction?=?new?SilentModeToggleAction();
????}?else?{
????????mSilentModeAction?=?new?SilentModeTriStateAction(mContext,?mAudioManager,?mHandler);
????}
????mAirplaneModeOn?=?new?ToggleAction(
????????????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)?{
????????void?onToggle(boolean?on)?{
????????????if?(mHasTelephony?&&?Boolean.parseBoolean(
????????????????????SystemProperties.get(TelephonyProperties.PROPERTY_INECM_MODE)))?{
????????????????mIsWaitingForEcmExit?=?true;
????????????????// Launch ECM exit dialog
????????????????Intent ecmDialogIntent?=
????????????????????????new?Intent(TelephonyIntents.ACTION_SHOW_NOTICE_ECM_BLOCK_OTHERS,?null);
????????????????ecmDialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
????????????????mContext.startActivity(ecmDialogIntent);
????????????}?else?{
????????????????changeAirplaneModeSystemSetting(on);
????????????}
????????}
????????@Override
????????protected?void?changeStateFromPress(boolean?buttonOn)?{
????????????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;
????????????}
????????}
????????public?boolean?showDuringKeyguard()?{
????????????return?true;
????????}
????????public?boolean?showBeforeProvisioning()?{
????????????return?false;
????????}
????};
????onAirplaneModeChanged();
????mItems?=?new?ArrayList<Action>();
????// first: power off
????mItems.add(
????????new?SinglePressAction(
????????????????com.android.internal.R.drawable.ic_lock_power_off,
????????????????R.string.global_action_power_off)?{
????????????public?void?onPress()?{
????????????????// shutdown by making sure radio and power are handled accordingly.
????????????????mWindowManagerFuncs.shutdown(true);
????????????}
????????????public?boolean?onLongPress()?{
????????????????mWindowManagerFuncs.rebootSafeMode(true);
????????????????return?true;
????????????}
????????????public?boolean?showDuringKeyguard()?{
????????????????return?true;
????????????}
????????????public?boolean?showBeforeProvisioning()?{
????????????????return?true;
????????????}
????????});
我們可以看到mItems.add函數(shù)是添加一個(gè)選項(xiàng),該菜單的第一個(gè)選項(xiàng)就是關(guān)機(jī)選項(xiàng),我們可以在此之后添加重啟選項(xiàng),代碼如下:
mItems.add(
????new?SinglePressAction(
????????com.android.internal.R.drawable.ic_lock_power_off,
????????R.string.global_action_reboot)?{?
?????
????????public?void?onPress()?{?
????????????// reboot?
????????????mWindowManagerFuncs.reboot();
????????}?
?????????
????????public?boolean?showDuringKeyguard()?{?
????????????return?true;
????????}?
?????????
????????public?boolean?showBeforeProvisioning()?{?
????????????return?true;?
????????}?
????});
上面的代碼中使用了mWindowManagerFuncs.reboot函數(shù)和R.string.global_action_reboot資源,因此我們需要該資源并實(shí)現(xiàn)reboot函數(shù)。
首先在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.
?*/
public?interface?WindowManagerFuncs?{
????...
????/**
?????* Switch the keyboard layout for the given device.
?????* Direction should be +1 or -1 to go to the next or previous keyboard layout.
?????*/
????public?void?switchKeyboardLayout(int?deviceId,?int?direction);
????public?void?shutdown();
????public?void?reboot();?
????public?void?rebootSafeMode();
}
然后在frameworks/base/services/java/com/android/server/wm/WindowManagerService.java中實(shí)現(xiàn)該接口:
// Called by window manager policy. Not exposed externally.
@Override
public?void?shutdown()?{
????ShutdownThread.shutdown(mContext,?true);
}
// Called by window manager policy. Not exposed externally.
@Override
public?void?reboot()?{
????ShutdownThread.reboot(mContext,?null,?true);
}
// Called by window manager policy. Not exposed externally.?
@Override
public?void?rebootSafeMode()?{
????ShutdownThread.rebootSafeMode(mContext,?true);
}
接下來(lái),為了在按下重啟選項(xiàng)之后,能出現(xiàn)”重啟“之類(lèi)的提示,還需要修改frameworks/base/services/java/com/android/server/pm/ShutdownThread.java中的shutdownInner函數(shù)和beginShutdownSequence函數(shù):
static?void?shutdownInner(final?Context?context,?boolean?confirm)?{
????// 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;
????????}
????}
????final?int?longPressBehavior?=?context.getResources().getInteger(
????????????????????com.android.internal.R.integer.config_longPressOnPowerBehavior);
????final?int?resourceId?=?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)?{
????????final?CloseDialogReceiver closer?=?new?CloseDialogReceiver(context);
????????final?AlertDialog?dialog?=?new?AlertDialog.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,?new?DialogInterface.OnClickListener()?{
????????????????????public?void?onClick(DialogInterface?dialog,?int?which)?{
????????????????????????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);
????}
}
private?static?void?beginShutdownSequence(Context?context)?{
???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?=?new?ProgressDialog(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?(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();
}
至此關(guān)于代碼部分的改動(dòng)全部完成,接下來(lái)就需要添加使用到的資源了,就是前面用到的字符串。首先需要在frameworks/base/core/res/res/values/strings.xml中添加一下字符串:
<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>
而后需要在frameworks/base/core/res/res/values/public.xml中聲明這些資源,否則編譯的時(shí)候會(huì)出現(xiàn)找不到該資源的錯(cuò)誤。
<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"?/>
至此,全部修改完成,編譯燒寫(xiě)即可。
首先關(guān)機(jī)的那個(gè)彈出菜單是在frameworks/base/policy/src/com/android/internal/policy/impl/GlobalActions.java這個(gè)文件中創(chuàng)建的:
點(diǎn)擊(此處)折疊或打開(kāi)
首先在frameworks/base/core/java/android/view/WindowManagerPolicy.java中添加reboot接口:
總結(jié)
以上是生活随笔為你收集整理的Android 4.1.2系统添加重启功能的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: android4.2添加重启菜单项
- 下一篇: Android关机流程源码分析