`
dss16694
  • 浏览: 147296 次
社区版块
存档分类
最新评论

为android增加重启菜单

阅读更多
转自:http://blog.csdn.net/zzp16/article/details/7829063
 
一、Android系统重启的实现方式
1、广播方式
之前的博文介绍过这种方式《使用广播实现的Android关机及重启》,注意应用要在源码中编译,并且应用需要系统权限。
 
2、通过init.rc启动系统服务来运行sh文件
a.重启shell文件(system_reboot.sh),放在system/etc/目录下
[java] view plaincopy
  1. #!/system/bin/sh    
  2. reboot  
b.init.rc中加入一个Service的定义
  1. service system_reboot /system/etc/system_reboot.sh  
  2.   oneshot  
  3.   disabled  
c.启动系统服务
  1. SystemProperties.set("ctl.start""system_reboot");  


3、直接代码中执行命令行
需要取得root权限
[java] view plaincopy
  1. Process proc = Runtime.getRuntime().exec(cmd);  

    以上三种方法可以实现重启,但现在需要实现长按关机键提示对话框中有重启选项,这就设计修改系统源码,感觉修改源码,是个很难的工作,其实找到关机提示框的代码位置,一切都变得很简单。
 
二、修改源码定制重启功能
1、跟踪长按Power键相关代码
    首先要了解长按电源键弹出对话框的相关源码位置,通过跟踪找到PhoneWindowManager.java中有截断长按电源键的方法,继续跟踪代码找到Runnable mPowerLongPress = new Runnable(),在该runnable里边调用showGlobalActionsDialog()方法便是显示长按power键弹出的关机提示对话框,如果你的机器是原生态的,默认提示“飞行模式”,“静音”和“关机”选项。
     showGlobalActionsDialog创建关机对话框的代码在GlobalActions.java里边,主要代码如下:
 
[java] view plaincopy
  1. private AlertDialog createDialog() {  
  2. ……  
  3. mItems = new ArrayList<Action>();  
  4.   
  5.         // first: power off  
  6.         mItems.add(  
  7.             new SinglePressAction(  
  8.                     com.android.internal.R.drawable.ic_lock_power_off,  
  9.                     R.string.global_action_power_off) {  
  10.   
  11.                 public void onPress() {  
  12.                     // shutdown by making sure radio and power are handled accordingly.  
  13.                     ShutdownThread.shutdown(mContext, true);  
  14.                 }  
  15.   
  16.                 public boolean showDuringKeyguard() {  
  17.                     return true;  
  18.                 }  
  19.   
  20.                 public boolean showBeforeProvisioning() {  
  21.                     return true;  
  22.                 }  
  23.             });  
  24.   
  25.         // next: airplane mode  
  26.         mItems.add(mAirplaneModeOn);  
  27.   
  28.         // last: silent mode  
  29.         if (SHOW_SILENT_TOGGLE) {  
  30.             mItems.add(mSilentModeAction);  
  31.         }  
  32. ……  
  33. }  
 
2、重启方法
    跟踪源码到此处,需要加入重启部分的源码也是往AlertDialog 添加多一项,显示部分的代码直接造这power off即可,需要加入重启逻辑的代码直接修改回调方法onPress里边(上边代码粗体部分),一开始,我尝试了前文中提示的三种方法中的方法一和方法三均行不通,后来也没再进一步排查原因,估计权限问题。
    本打算使用方法二再尝试一下,突然想到为何不去看看关机的逻辑代码ShutdownThread.shutdown(),打开ShutdownThread.java,很快就发现源码里边也有reboot的实现方法,如下:
    
[java] view plaincopy
  1. /** 
  2.      * Request a clean shutdown, waiting for subsystems to clean up their 
  3.      * state etc.  Must be called from a Looper thread in which its UI 
  4.      * is shown. 
  5.      * 
  6.      * @param context Context used to display the shutdown progress dialog. 
  7.      * @param reason code to pass to the kernel (e.g. "recovery"), or null. 
  8.      * @param confirm true if user confirmation is needed before shutting down. 
  9.      */  
  10.     public static void reboot(final Context context, String reason, boolean confirm){  
  11.      ……  
  12.      }  
   该方法的使用直接看注释知道,reboot方法的后两个参数解释如下:
     reason  如果值为是null,正常重启;如果是recovery,系统重启进入recovery mode
     confirm true显示关机提示框,需要用户【确认】;false不显示提示框,直接关机
 
3、代码修改
a.在关机提示框中加入重启选项
    弄清楚关机相关的源码,直接在GlobalActions.java的createDialog方法中加入如下代码即可:
 
[java] view plaincopy
  1. ...  
  2. ext: reboot global_action_reboot  
  3.   mItems.add(  
  4.    new SinglePressAction(  
  5.               com.android.internal.R.drawable.ic_lock_power_off,  
  6.               R.string.global_action_reboot) {  
  7.   
  8.           public void onPress() {  
  9.         // reboot  
  10.            ShutdownThread.reboot(mContext,null,false);                
  11.           }  
  12.   
  13.           public boolean showDuringKeyguard() {  
  14.               return true;  
  15.           }  
  16.   
  17.           public boolean showBeforeProvisioning() {  
  18.               return true;  
  19.           }  
  20.       });  
b.修改重启提示框,以区分关机提示框
  因为提示框默认是“关机”,在ShutdownThread.java的beginShutdownSequence(context)方法中代码修改如下:
[java] view plaincopy
  1. /*/ 
  2. //修改前: 
  3. …… 
  4.  pd.setTitle(context.getText(com.android.internal.R.string.power_off)); 
  5.  pd.setMessage(context.getText(com.android.internal.R.string.shutdown_progress)); 
  6. …… 
  7. /*/  
  8. //修改后:  
  9. ……  
  10. if(mReboot){     // reboot progress  
  11.          pd.setTitle(context.getText(com.android.internal.R.string.global_action_reboot));  
  12.          pd.setMessage(context.getText(com.android.internal.R.string.reboot_progress));  
  13.      }else{          // shutdown progress  
  14.          pd.setTitle(context.getText(com.android.internal.R.string.power_off));  
  15.          pd.setMessage(context.getText(com.android.internal.R.string.shutdown_progress));  
  16.      }  
  17. ……  
  18. //*/  




     重启功能实现了,但是不能到此结束,定制Android系统的重启功能,添加选项和修改重启提示框时加入了“重启”和“正在重启”的字符串,所以会涉及到在系统资源文件中添加新的字符串,源码中资源文件涉及到的多国语言直接忽略,我只在values/strings.xml和values-zh-rCN/strings.xml两个文件中加入对应的字符串
[html] view plaincopy
  1. <string name="global_action_reboot">重启</string>  
  2. <string name="reboot_progress">"正在重启..."</string>  


c.最后编译
因为修改涉及到系统资源文件又涉及到policy.jar包,经过多次尝试,正确的编译顺序如下:
步骤1.编译frameworks/base/res,在out/target/product/X设备名X/system/framework/目录下生成framework-res.apk
步骤2.编译frameworks/base/,在o同样目录下生成framework.jar包(不能忽略,不然步骤3编译报错)
步骤3.编译frameworks/base/policy,在同样目录下生成policy.jar包
 
 
附录:
本例源码以Android 4.0.4为准(2.3一样),关机相关的源码路径:
ics/frameworks/base/policy/src/com/android/internal/policy/impl/目录下:
PhoneWindowManager.java
GlobalActions.java
 
ics/frameworks/base/core/java/com/android/internal/app/目录下:
ShutdownThread.java
 
 
PS:4.1.1 关机相关方法位置有些变化
源码已经把关机的接口整合到:
public class WindowManagerService extends IWindowManager.Stub
        implements Watchdog.Monitor, WindowManagerPolicy.WindowManagerFuncs{...}中
不过可以直接使用:
import com.android.server.pm.ShutdownThread;
 
ShutdownThread.shutdown(mContext, true);
ShutdownThread.rebootSafeMode(mContext, true);
 
文件路径:
Android4.1.1/jb/frameworks/base/services/java/com/android/server/pm/
ShutdownThread.java
 
Android4.1.1/jb/frameworks/base/services/java/com/android/server/wm
WindowManagerService.java
 
...
分享到:
评论

相关推荐

    MTK6577+Android之增加重启功能

    在Android系统中,添加重启功能通常涉及到对系统框架层的修改。MTK6577是MediaTek推出的一款双核处理器,常用于中低端智能手机。在这个场景中,我们需要在长按电源键时显示的全局操作菜单(Global Actions)中加入...

    android fragment 底部动画菜单 导航动画

    底部导航菜单(Bottom Navigation)是Android设计规范中推荐的一种用户交互模式,用于在3到5个主要功能之间进行切换。本教程将深入探讨如何在Android应用中实现一个基于Fragment的底部动画菜单,并实现导航和各种...

    Android 6.0开发实现关机菜单添加重启按钮的方法

    "Android 6.0添加关机菜单重启按钮实现方法" Android 6.0开发实现关机菜单添加重启按钮的方法主要是通过修改Android 6.0的源码实现的。下面是实现的步骤和方法: 首先,在/trunk/LINUX/android/frameworks/base/...

    安卓底部菜单实现源码

    `Fragment`是Android中的一个可重用组件,它可以独立于Activity存在,允许在不重启Activity的情况下更改屏幕内容。在底部菜单中,每个菜单项对应一个`Fragment`,点击菜单项时,对应的`Fragment`会被添加到容器(如...

    Android源码——关机和重启(reboot and shutdown)源码.zip

    当用户通过电源菜单选择关机或重启时,这个服务会被触发。它负责执行一系列步骤,如保存系统状态、停止用户界面、关闭网络连接等。 3. **PowerManagerService**: `com.android.server.power.PowerManagerService`...

    Android SDK离线包合集(Android 4.0-5.0)

    这是Android开发所需的sdk,下载并解压后,将解压出的整个文件夹复制或者移动到your sdk 路径/platforms文件夹,然后打开SDK Manager,打开 Tools(工具)菜单选择Options(选项)菜单项打开 Android SDK Manager ...

    Android 关机和重启(reboot and shutdown)源码.rar

    在Android系统中,关机和重启是两个基本但至关重要的操作。它们涉及到系统的生命周期管理和硬件资源的管理。这里,我们主要探讨的是Android关机和重启的源码实现,这将帮助我们深入理解Android系统的底层机制。 1. ...

    Android关机和重启reboot-and-shutdown源码.zip

    当用户触发关机或重启命令时,例如通过电源菜单或ADB命令,这些请求会被传递到SystemServer。 1. **BroadcastReceiver**:首先,系统会发送一个ACTION_SHUTDOWN或ACTION_REBOOT广播,这通常由Intent.ACTION_...

    Android控制PC的关机、重启、休眠、注销、锁定

    在Android平台上实现对PC的远程控制,如关机、重启、休眠、注销和锁定,是一种集成设备管理和自动化任务的高级技术。这个功能通常通过在Android设备上编写客户端应用程序,并在PC端设置服务器来实现。以下是一些核心...

    Mac - Android Studio 4.2.2

    Mac版的Android Studio 4.2.2是一款专为 macOS 用户设计的强大集成开发环境(IDE),用于构建Android应用程序。此版本是官方渠道提供的,确保了软件的可靠性和安全性。下面将详细介绍Android Studio 4.2.2在macOS上...

    用Android-X86和VirtualBox打造高性能Android开发环境

    安装结束后,会弹出一个菜单三个选项分别是运行 Android,创建一个虚拟 SD 卡,重启。 step 4:自定义虚拟机分辨率 在开发时肯定需要测试不同的分辨率,那么如何自定义 Android-x86 的分辨率?在 Android-x86 中...

    Fragment碎片实现底部菜单栏,仿支付宝UI

    通过设置`menu.xml`资源文件,我们可以为底部菜单栏定义图标和文字标签。 接下来,我们需要实现`BottomNavigationView`的监听器,当用户点击不同的菜单项时,动态替换Activity中的Fragment。这可以通过`...

    关机重启TV版源码

    "关机重启应用源码"意味着开发者提供了该功能的原始代码,这为其他开发者或者对Android系统有深入了解的用户提供了自定义和修改的可能性。通过分析和理解源码,人们可以学习如何在Android平台上进行系统级别的操作,...

    Android Studio代码高亮插件

    4. 完成导入后,Android Studio可能需要重启以使新的设置生效。按照提示重启Android Studio。 在导入设置后,你可能会发现代码的颜色和样式已经发生了变化,这就是代码高亮插件的效果。除了全局的主题更改,Android...

    Android开发环境搭建全程演示(jdk+eclip+android sdk)

    打开 Eclipse,在菜单栏上选择 Help-&gt; Install New Software,输入网址 https://dl-ssl.google.com/android/eclipse/,名称可以自定义,点击 OK,安装完成后,出现如下界面,点击 Yes 按钮,重启 Eclipse。...

    Android Studio 插件android-butterknife-zelezny.jar

    安装完成后,当你打开一个布局文件时,可以在"Generate"菜单中看到" ButterKnife Bindings"选项。选择它,插件会自动检测布局文件中的所有视图,并为你生成对应的ButterKnife注解代码。 例如,如果你有一个XML布局...

    MyEclipse安装Android ADT

    Android ADT是一款专为Android开发者设计的Eclipse插件,它提供了丰富的图形化界面和工具,使得开发者可以更加高效地编写、调试和测试Android应用程序。ADT包括了项目管理、代码编辑、布局设计、调试器等组件,极大...

    如何在Eclipse环境配置Android

    1. 点击菜单“Run”--&gt;“Run”,在弹出窗口中选择以“Android Application”运行程序,即可调动 AVD 运行测试程序了。 本文详细介绍了如何在 Eclipse 环境下配置 Android 开发环境,包括安装必要的工具、配置环境...

Global site tag (gtag.js) - Google Analytics