修改Android framework定制重启功能

涉及到的源码(4.0)
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


1,跟踪Power键的长按事件,定位到弹出关机Dialog的源码是在PhoneWindowManager.java中
继续跟踪代码找到Runnable mPowerLongPress = new Runnable(),在该runnable里边调用showGlobalActionsDialog()方法便是显示长按power键弹出的关机提示对话框,如果你的机器是原生态的,默认提示“飞行模式”,“静音”和“关机”选项。
showGlobalActionsDialog创建关机对话框的代码在GlobalActions.java里边,主要代码如下:

private AlertDialog createDialog() {
……
mItems = new ArrayList();

// 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.
ShutdownThread.shutdown(mContext, true);
}

public boolean showDuringKeyguard() {
return true;
}

public boolean showBeforeProvisioning() {
return true;
}
});
[color=red] mItems.add(
new SinglePressAction(
com.android.internal.R.drawable.ic_lock_power_off,
R.string.global_action_reboot) {

public void onPress() {
// shutdown by making sure radio and power are handled accordingly.
ShutdownThread.reboot(mContext, true);
}

public boolean showDuringKeyguard() {
return true;
}

public boolean showBeforeProvisioning() {
return true;
}
});[/color]
// next: airplane mode
mItems.add(mAirplaneModeOn);

// last: silent mode
if (SHOW_SILENT_TOGGLE) {
mItems.add(mSilentModeAction);
}
……


如上,加入红色部分代码,由于ShutdownThread中已经有了reboot函数。
当然要在values/strings.xml中加入

重启
"正在重启..."

reboot方法的后两个参数解释如下:
reason 如果值为是null,正常重启;如果是recovery,系统重启进入recovery mode
confirm true显示关机提示框,需要用户【确认】;false不显示提示框,直接关机

2,另外一个问题是提示框的问题
在ShutdownThread.java的beginShutdownSequence(context)中加入对是否为reboot的判断:

……
if(mReboot){ // reboot progress
pd.setTitle(context.getText(com.android.internal.R.string.global_action_reboot));
pd.setMessage(context.getText(com.android.internal.R.string.reboot_progress));
}else{ // shutdown progress
pd.setTitle(context.getText(com.android.internal.R.string.power_off));
pd.setMessage(context.getText(com.android.internal.R.string.shutdown_progress));
}
……



3,编译
注意顺序
最后编译
因为修改涉及到系统资源文件又涉及到policy.jar包,所以按照以下顺序:
步骤1.编译frameworks/base/res,在out/target/product/X设备名X/system/framework/目录下生成framework-res.apk
步骤2.编译frameworks/base/,在out同样目录下生成framework.jar包(不能忽略,不然步骤3编译报错)
步骤3.编译frameworks/base/policy,在同样目录下生成policy.jar包

你可能感兴趣的:(android系统)