日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android 4.1.2系统添加重启功能

發(fā)布時(shí)間:2025/4/16 Android 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android 4.1.2系统添加重启功能 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
對于Android的的手機(jī)或者平板長期使用,感覺會出現(xiàn)慢的情況,所以偶爾還是需要重啟一下,而長按電源鍵彈出的菜單又沒有重啟選項(xiàng),所以特在此記錄自己添加這個(gè)功能的過程。
首先關(guān)機(jī)的那個(gè)彈出菜單是在frameworks/base/policy/src/com/android/internal/policy/impl/GlobalActions.java這個(gè)文件中創(chuàng)建的:

點(diǎn)擊(此處)折疊或打開

  • /**
  • ?* 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);
  • }
  • 接下來,為了在按下重啟選項(xiàng)之后,能出現(xiàn)”重啟“之類的提示,還需要修改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)于代碼部分的改動全部完成,接下來就需要添加使用到的資源了,就是前面用到的字符串。首先需要在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í)候會出現(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"?/>
  • 至此,全部修改完成,編譯燒寫即可。

    總結(jié)

    以上是生活随笔為你收集整理的Android 4.1.2系统添加重启功能的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 亚洲va天堂va欧美ⅴa在线 | 亚洲精品一二三四区 | 国产日韩欧美精品在线 | 亚洲国产成人在线视频 | 日本午夜小视频 | 中出视频在线观看 | 亚洲精品乱码久久久久99 | 91看黄| 亚洲午夜精品久久久久久人妖 | 波多野结衣久久久久 | 佐佐木明希电影 | 超碰98| 中文字幕日韩亚洲 | 欧美大浪妇猛交饥渴大叫 | 欧美日韩国产在线播放 | 第一页综合| 国产精品成人一区二区网站软件 | 久久久久网站 | 国产亚洲一区二区三区不卡 | 日日噜噜夜夜爽爽 | 黄污视频在线观看 | 大奶子网站 | 一出一进一爽一粗一大视频 | av女人的天堂 | 午夜电影福利网 | 国产一级大片在线观看 | 亚洲欧美少妇 | 日本精品在线播放 | 久久艹国产精品 | 日韩成人免费在线观看 | 黑人巨大精品一区二区在线 | 538在线精品视频 | 国产中文字幕在线播放 | 亚洲精品高清无码视频 | 开心激情网五月天 | 欧美黄色一区 | 五级毛片 | av导航网站 | 成人av一区二区在线观看 | 日批小视频 | 精品欧美日韩 | 国产主播精品 | av2018| 国产精品无码一区 | 日韩精品在线免费看 | 国产精品精东影业 | 欧美精品123区 | 亚洲第一男人天堂 | 美女搞黄在线观看 | 日韩视频一区二区三区四区 | 欧美专区第一页 | 国产精品视频大全 | 1级性生活片 | 日本高清视频在线观看 | 免费一区二区三区四区 | 欧洲精品一区二区三区久久 | 九九九九国产 | 日韩在线不卡 | 午夜两性网 | 花样视频污 | 免费在线国产精品 | 日韩视频在线观看视频 | 在线免费观看国产精品 | 五月婷婷激情五月 | 少妇愉情理伦片bd | 中日韩精品一区二区三区 | 看av免费毛片手机播放 | 无码国产69精品久久久久同性 | 浪漫樱花在线观看高清动漫 | 欧美网站在线 | 亚洲电影在线观看 | 欧美bbbbbbbbbbbb18av | 欧美一区二区三区在线看 | 欧美双性人妖o0 | 中文字幕成人一区 | av中文字幕网址 | 日日爱99 | 成人免费无遮挡无码黄漫视频 | 亚洲人视频在线 | 国产一级在线视频 | 日韩毛片高清在线播放 | 涩涩屋视频在线观看 | 亚洲美女性视频 | 先锋影音av资源网站 | 91福利视频网站 | 亚洲狼人天堂 | 国产盗摄精品一区二区酒店 | www日韩欧美 | wwwjizzzcom| 黄在线免费| 欧美一级不卡视频 | 久热中文 | 久久亚洲国产成人精品性色 | 99色图| 日本乱码视频 | 67194午夜| www.狠狠插| 丰满岳妇乱一区二区三区 | 亚洲人在线观看视频 |