最近客户发现我们的机器没有长按power按钮重启手机的功能,就对我们说研发说你们看看人家三星做的多好 ,你们咋就不自觉给我加上这些功能呢!非要我们提出~~我去你大爷的,你这坑爹的!你不说我怎么你要呢~想要你就说嘛!客户就是上帝,不解释废话就不多说了~抓紧时间Coding
在这先要感谢zzp16 http://blog.csdn.net/zzp16/article/details/7829063这篇博文的指导,写的很详细在android4.0的机器是尝试了都是ok的 但是新的android4.12平台不行,所以自己又研究了下!现在讲自己在android4.12上做的Restart功能分享下,希望给大家有帮助~不会分享的程序员不是好程序员!!!
长按Power键相关代码
首先要了解长按电源键弹出对话框的相关源码位置,通过跟踪找到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;
}
});
// next: airplane mode
mItems.add(mAirplaneModeOn);
// last: silent mode
if (SHOW_SILENT_TOGGLE) {
mItems.add(mSilentModeAction);
}
……
}
直接在GlobalActions.java的createDialog方法中加入重启的按钮如下代码即可:
mItems.add(
new SinglePressAction(
com.android.internal.R.drawable.ic_lock_power_off,
R.string.global_action_reboot) {
public void onPress() {
// reboot
mWindowManagerFuncs.reboot();
}
public boolean showDuringKeyguard() {
return true;
}
public boolean showBeforeProvisioning() {
return true;
}
});
注意onPress()中的mWindowManagerFuncs.reboot()方法!因为在android 4.12 中import com.android.server.pm.ShutdownThread;这个类未公开不能直接引用~所以这个功能变的复杂了呢!但是这都阻止不了一个程序员前进的脚步~此路不通咋就换个路呗!
研究后我用了mWindowManagerFuncs.reboot()这个方法。先在WindowManagerPolicy.java中添加reboot()方法
public void shutdown(boolean confirm);
+ public void reboot();
public void rebootSafeMode();
在WindowManagerService.java里面调用reboot方法
@Override
public void reboot(){
ShutdownThread.reboot(mContext,null,false);
};
在这个里面import com.android.server.pm.ShutdownThread 就可以直接引用了 转了一圈还是用这个方法!哎~就是为了你~我翻山越岭啊 !
最后我们在ShutdownThread.java的beginShutdownSequence(context)方法中代码修改如下:
/*/
//修改前:
……
pd.setTitle(context.getText(com.android.internal.R.string.power_off));
pd.setMessage(context.getText(com.android.internal.R.string.shutdown_progress));
……
/*/
//修改后:
……
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));
}
……
//*/
<string name="global_action_reboot">Reboot system</string> <string name="global_action_reboot_progress">"Reboot processes..."</string> <string name="global_action_reboot">重启手机</string> <string name="global_action_reboot_progress">"正在重启手机..."</string>
添加多语言的字符串就不要多说了~
最后编译下framework 烧到机器里面 重启下机器~打完收工了!
附录:
本例源码以Android 4.12为准,修改重启相关的源码路径:
frameworks/base/policy/src/com/android/internal/policy/impl/GlobalActions.java
frameworks/base/services/java/com/android/server/pm/ShutdownThread.java
frameworks/base/services/java/com/android/server/wm/WindowManagerService.java
ok了!希望有帮助~如果不行的话可以在交流~~