Android4.4关机菜单添加重启系列选项

版权声明:本文为博主原创文章,欢迎转载, 转载请注明出处: https://blog.csdn.net/xinxinsky/article/details/50801856

本来以为挺简单的修改,没想到花了一天的时间,在此记录下修改过程

首先,定义几个字符串,重启,正在重启....


/frameworks/base/core/res/res/values/strings.xml
/frameworks/base/core/res/res/values-zh-rCN/strings.xml

两个文件中分别添加定义:

    <string name="global_action_power_reboot">Reboot</string>
    <!-- 安全模式 -->
    <string name="global_action_power_safemode">Safe Mode</string>
    <string name="reboot_progress">"Rebooting..."</string>


    <string name="global_action_power_reboot">重启</string>
    <string name="global_action_power_safemode">重启到安全模式</string>
    <string name="reboot_progress">"正在重启..."</string>


光在这里定义完是没用的,之后你在Java代码中引用会报错,所以还要在
/frameworks/base/core/res/res/values/public.xml文件中添加声明

  <public type="string" name="global_action_power_reboot" id="0x01040018" />
  <public type="string" name="global_action_power_safemode" id="0x01040019" />
  <public type="string" name="reboot_progress" id="0x0104001a" />

到这里你以为声明完了么?我以为声明完了,结果到快编译完时又报错,根据提示,需要在
/frameworks/base/api/current.txt文件中声明API接口,我这不是外部应用,为毛要声明?那就继续添加呗

查找public static final class R.string {声明,添加定义
    field public static final int global_action_power_reboot = 17039384; // 0x1040018
    field public static final int global_action_power_safemode = 17039385; // 0x1040019
    field public static final int reboot_progress = 17039386; // 0x104001a

这些字符串的ID是搜索没有定义的ID然后自己编写上去的,可根据情况进行修改,但在public.xml跟current.txt中保持一致

做完这些才算定义完....

修改代码:

/frameworks/base/policy/src/com/android/internal/policy/impl/GlobalActions.java
1. 导入需要的包

import java.io.File;
import java.io.FileWriter;
import android.os.PowerManager;
import java.io.IOException;

找到函数

private GlobalActionsDialog createDialog()

在mItems = new ArrayList<Action>();后面进行添加

        // 2016-03-03 14:43:58 添加重启菜单
        mItems.add(
            new SinglePressAction(
                    com.android.internal.R.drawable.stat_notify_sync,
                    R.string.global_action_power_reboot) {

                public void onPress() {
                	// 重启
                	PowerManager pm = (PowerManager)mContext.getSystemService(Context.POWER_SERVICE);  
				    pm.reboot(null); // 调用PowerManager类中的reboot方法
                }

                public boolean showDuringKeyguard() {
                    return true;
                }

                public boolean showBeforeProvisioning() {
                    return true;
                }
            });

        // 2016-03-03 14:49:03 添加重启到安全模式
        mItems.add(
            new SinglePressAction(
                    com.android.internal.R.drawable.ic_print_error,
                    R.string.global_action_power_safemode) {

                public void onPress() {
                	// 重启到安全模式
                    mWindowManagerFuncs.rebootSafeMode(true);
                }
                
                public boolean onLongPress() {
                	// 长按重启到Recovery
                	recoveryMode(mContext);
                    return true;
                }

                public boolean showDuringKeyguard() {
                    return true;
                }

                public boolean showBeforeProvisioning() {
                    return true;
                }
            });
其中的图片资源使用系统现有的,没有另外进行添加,从添加字符串可以想到添加个图片资源也不省心,干脆用现有的资源好了

到这里要说改完了么?功能都已经实现了,不过关机时显示的是正在关机,这多少有些差强人意了,那么就修改

/frameworks/base/services/java/com/android/server/power/ShutdownThread.java文件

查找private static void beginShutdownSequence(Context context)函数

        // 修改这段代码
        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);
        // 修改后
        ProgressDialog pd = new ProgressDialog(context);
        if (mReboot){
            pd.setTitle(context.getText(com.android.internal.R.string.global_action_power_reboot));
            pd.setMessage(context.getText(com.android.internal.R.string.reboot_progress));
        }
        else{
            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);
这样重启时就会显示正在重启进度框了.

要说为什么之前不直接使用ShutdownThread.reboot方法呢?开始也用了,但是提示未定义错误,引用com.android.server.power.ShutdownThread也没用,

最后使用了PowerManager接口了.... 


PS: 我就知道Android不会这么弱,是我太菜....

自定义的字符不需要在public.xml跟current.txt中声明,

到文件:/frameworks/base/core/res/res/values/symbols.xml中进行声明即可

  <java-symbol type="string" name="global_action_power_reboot" />
  <java-symbol type="string" name="global_action_power_safemode" />
  <java-symbol type="string" name="reboot_progress" />
  <java-symbol type="drawable" name="perm_group_sync_settings" />
  <java-symbol type="drawable" name="ic_dialog_alert_holo_dark" />
也不用自定义ID什么的,就这么简单,图片也可以自定义....

展开阅读全文

没有更多推荐了,返回首页