Android 4.1.2系统添加重启功能
对于Android的的手机或者平板长期使用,感觉会出现慢的情况,所以偶尔还是需要重启一下,而长按电源键弹出的菜单又没有重启选项,所以特在此记录自己添加这个功能的过程。
首先关机的那个弹出菜单是在frameworks/base/policy/src/com/android/internal/policy/impl/GlobalActions.java这个文件中创建的:
点击(此处)折叠或打开
- /**
- * 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函数是添加一个选项,该菜单的第一个选项就是关机选项,我们可以在此之后添加重启选项,代码如下:
- 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函数和R.string.global_action_reboot资源,因此我们需要该资源并实现reboot函数。
首先在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中实现该接口:
- // 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);
- }
接下来,为了在按下重启选项之后,能出现”重启“之类的提示,还需要修改frameworks/base/services/java/com/android/server/pm/ShutdownThread.java中的shutdownInner函数和beginShutdownSequence函数:
- 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();
- }
至此关于代码部分的改动全部完成,接下来就需要添加使用到的资源了,就是前面用到的字符串。首先需要在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中声明这些资源,否则编译的时候会出现找不到该资源的错误。
- <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" />
至此,全部修改完成,编译烧写即可。
Android 4.1.2系统添加重启功能相关推荐
- 为Android系统定制重启功能
按计划每周更新一篇技术博文,第二篇:<为Android系统定制重启功能> 一.Android系统重启的实现方式 1.广播方式 之前的博文介绍过这种方式<使用广播实现的Android关 ...
- Android 电量监控、关机、重启功能的实现
本文主要是介绍Android电量监控.关机.重启功能的实现,需要具备的条件是手机需要root过,才能实现相关操作. 1.MainActivity.java import java.io.IOExcep ...
- Django by Example·第二章|Enhancing Your Blog with Advanced Features(为博客系统添加高级功能)@笔记
Django by Example·第二章|Enhancing Your Blog with Advanced Features(为博客系统添加高级功能)@笔记 这本书的结构确实很不错,如果能够坚持看 ...
- Android 5.1长按电源键添加重启功能
原址:http://blog.csdn.net/zhoumushui 现在长按Power键只有一个关机键,需要添加一个重启,以下是我的添加步骤: 1.在frameworks/base/core/res ...
- HEXO博客系统添加搜索功能
Hexo 可以通过接入第三方搜索引擎来为博客添加搜索功能.这里给出一种基于 Algolia 搜索引擎的实现方式. 流程 Algolia 是一家搜索解决方案提供商,提供强大的搜索服务和 API 接口.在 ...
- android 4.0.4系统添加波斯语
1 确定好语言和国家对照表,波斯与对照如下: fa_IR 2 根据build\target\product\sdk.mk $(call inherit-product-if-exists, frame ...
- android 9.0 屏蔽系统所有通知功能实现
目录 1.概述 2.屏蔽系统所有通知功能实现的核心类 3.屏蔽系统所有通知功能实现的核心功能实现和分析
- 机房收费系统-添加密保功能
起因 之前曾经和小伙伴讨论过关于机房收费系统的安全性的问题,如果忘了密码怎么办? 于是脑洞就来了,就联想到了QQ的密保功能!于是就开始干了 思路 密保用来找回密码,所以需要在数据库user_info中 ...
- Android Q及以上系统音频捕获功能(声音内录)的简单实现
前言 现在越来越多的视频类APP,如抖音.快手.B站等等,都开放了音频捕获配置,也就是android:allowAudioPlaybackCapture="true".因此学习如何 ...
最新文章
- 【nginx】从主页搭建看nginx常用配置
- javaScript中变量作用域
- ubuntu shell实现99乘法表
- linux添加三权,基于SELinux的三权分离技术的研究
- 蓝桥杯 ALGO-46 算法训练 Hanoi问题
- DNS解释问题:java.net.UnknownHostException
- java swt 双屏_SWT(JFace)体验之打开多个Form
- 《JAVA程序设计教程 (第二版)雍俊海编著》pdf 附下载链接
- cuda和cudnn下载地址
- Python 搜狗词库的批量下载
- 魔百盒九联UNT402H,(芒果、南传、百视通)等通刷刷机固件
- 由于找不到 MSVCR120.dll,无法继续执行代码终极解决方法
- python-opencv标定相机内参(针孔+鱼目)
- bigdecimal 平均数_用Java计算平均值
- 全国计算机四级之网络工程师知识点(四)
- ArrayList删除某元素的几种方法
- PD866EZ-12D/YCZ多用户预付费电表 上传至西安市能耗平台
- STM32、NBIOT、Lora模块烧写方法-Hex文件烧录步骤详解-新大陆物联网设备-NEWLab开发板
- Android 系统编译技巧
- 【Appium】基于 Appium 的 iOS 自动化
热门文章
- 043_Card卡片
- 035_jQuery Ajax的ajaxSetup方法
- 087_html5表单元素
- 008_logback配置语法
- 福建高职单招计算机基础知识,福建高职单招计算机类试题及标准答案
- 从Linux上查看接口路由IP(吓一跳ip)
- 第六章 ORacle权限设置、schema、通过profile 限制用户恶意登录、通过profile限制使用期限
- Unity各个版本的离线文档下载和配置方法
- 向量空间和计算机科学与技术,向量空间
- 设计一个名为complex的类来表示复数_天线波束设计