android 4.12 定制Restart功能

来源:互联网 发布:discuz源码安装 编辑:程序博客网 时间:2024/06/01 09:29

        最近客户发现我们的机器没有长按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方法
 
@Overridepublic 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/core/java/android/view/WindowManagerPolicy.java
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了!希望有帮助~如果不行的话可以在交流~~

 




原创粉丝点击