修改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<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.  
                    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中加入
    <string name="global_action_reboot">重启</string>  
    <string name="reboot_progress">"正在重启..."</string>

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包

猜你喜欢

转载自ericchan2012.iteye.com/blog/1632902