本来以为挺简单的修改,没想到花了一天的时间,在此记录下修改过程
首先,定义几个字符串,重启,正在重启....
在
/frameworks/base/core/res/res/values/strings.xml
/frameworks/base/core/res/res/values-zh-rCN/strings.xml
两个文件中分别添加定义:
Reboot
Safe Mode
"Rebooting..."
重启
重启到安全模式
"正在重启..."
光在这里定义完是没用的,之后你在Java代码中引用会报错,所以还要在
/frameworks/base/core/res/res/values/public.xml文件中添加声明
到这里你以为声明完了么?我以为声明完了,结果到快编译完时又报错,根据提示,需要在
/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();后面进行添加
// 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中进行声明即可
也不用自定义ID什么的,就这么简单,图片也可以自定义....