长按电源键,为Android手机添加自动重启Item

来源:互联网 发布:微生物多样性分析软件 编辑:程序博客网 时间:2024/04/28 05:02

修改Framwork层源码添加重启效果如下  :  仿照关机代码写重启效果

修改实现的方法如下:

1.添加重新启动的图标 分别适应  高清 高 中 低    4 种不同的分辨率 路径如下

frameworks/base/core/res/res/drawable-hdpi/ic_lock_reboot.png

frameworks/base/core/res/res/drawable-ldpi/ic_lock_reboot.png

frameworks/base/core/res/res/drawable-mdpi/ic_lock_reboot.png

/frameworks/base/core/res/res/drawable-xhdpi/ic_lock_reboot.png

图标如下:

2.准备一下重启提示语的字符串

支持英语修改路径:frameworks/base/core/res/res/values/strings.xml

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <string name="reboot_confirm" product="tablet">Your phone will reboot.</string>  
  2.     <string name="reboot_confirm" product="default">Your phone will reboot.</string>  
  3.     <string name="reboot_confirm_question">Do you want to reboot?</string>  
  4.     <string name="reboot">Reboot</string>  

支持中文修改路径:

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <string name="reboot">重新启动</string>      
  2. <string name="reboot_confirm" product="tablet">您的手机将会重新启动.</string>  
  3. <string name="reboot_confirm" product="default">您的手机将会重新启动.</string>      
  4. <string name="reboot_confirm_question">您要重新启动吗?</string>  

3.为弹出的对话框添加一个重启的item

修改路径如下:frameworks/base/policy/src/com/android/internal/policy/impl/GlobalActions.java

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1.  // first: power off  这个是关机的item  
  2.         mItems.add(  
  3.             new SinglePressAction(  
  4.                     com.android.internal.R.drawable.ic_lock_power_off,  
  5.                     R.string.global_action_power_off) {  
  6.   
  7.                 public void onPress() {  
  8.                     // shutdown by making sure radio and power are handled accordingly.  
  9.                     mWindowManagerFuncs.shutdown(true);  
  10.                 }  
  11.   
  12.                 public boolean onLongPress() {  
  13.                     mWindowManagerFuncs.rebootSafeMode(true);  
  14.                     return true;  
  15.                 }  
  16.   
  17.                 public boolean showDuringKeyguard() {  
  18.                     return true;  
  19.                 }  
  20.   
  21.                 public boolean showBeforeProvisioning() {  
  22.                     return true;  
  23.                 }  
  24.             });  
  25. //----------------------添加重启的item  add start   
  26.         mItems.add(  
  27.             new SinglePressAction(  
  28.                     com.android.internal.R.drawable.ic_lock_reboot,  
  29.                     R.string.global_action_reboot) {  
  30.   
  31.                 public void onPress() {  
  32.                     // shutdown by making sure radio and power are handled accordingly.  
  33.                     mWindowManagerFuncs.reboot(true);  
  34.                 }  
  35.   
  36.                 public boolean onLongPress() {  
  37.                     return true;  
  38.                 }  
  39.   
  40.                 public boolean showDuringKeyguard() {  
  41.                     return true;  
  42.                 }  
  43.   
  44.                 public boolean showBeforeProvisioning() {  
  45.                     return true;  
  46.                 }  
  47.             });     // add end   

4.添加重启的方法   仿照关机跟进入安全模式的方法写重启方法

修改路径: frameworks/base/core/java/android/view/WindowManagerPolicy.java

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. public void shutdown(boolean confirm);  
  2. public void reboot(boolean confirm);                     // add this line    
  3. public void rebootSafeMode(boolean confirm);  

5.实现重启reboot的方法

添加路径如下:frameworks/base/services/java/com/android/server/wm/WindowManagerService.java

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. // 关机  
  2.   public void shutdown(boolean confirm) {  
  3.       ShutdownThread.shutdown(mContext, confirm);  
  4.   }  
  5.  //add start 添加从其方法  
  6.   public void reboot(boolean confirm) {  
  7.       ShutdownThread.reboot(mContext,"", confirm);  
  8.   }  
  9.   
  10.   // Called by window manager policy.  Not exposed externally.  
  11. //进入安全模式  
  12.   public void rebootSafeMode(boolean confirm) {  
  13.       ShutdownThread.rebootSafeMode(mContext, confirm);  
  14.   }  

6.重启方法调用线程实现

修改路径:frameworks/base/services/java/com/android/server/power/ShutdownThread.java
修改ShutdownThread  类中的shutdownInner方法 共3个修改点


[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. static void shutdownInner(final Context context, boolean confirm) {  
  2.        // ensure that only one thread is trying to power down.  
  3.        // any additional calls are just returned  
  4.        synchronized (sIsStartedGuard) {  
  5.            if (sIsStarted) {  
  6.                Log.d(TAG, "Request to shutdown already running, returning.");  
  7.                return;  
  8.            }  
  9.        }  
  10.   
  11.        Log.d(TAG, "Notifying thread to start radio shutdown");  
  12.        bConfirmForAnimation = confirm;  
  13.        final int longPressBehavior = context.getResources().getInteger(  
  14.                com.android.internal.R.integer.config_longPressOnPowerBehavior);  
  15.        int resourceId = mRebootSafeMode                   // -----------modify ------delete  final    
  16.            ? com.android.internal.R.string.reboot_safemode_confirm  
  17.            : (longPressBehavior == 2  
  18.                    ? com.android.internal.R.string.shutdown_confirm_question  
  19.                    : com.android.internal.R.string.shutdown_confirm);  
  20.   
  21.        Log.d(TAG, "Notifying thread to start shutdown longPressBehavior=" + longPressBehavior);  
  22.       
  23.     if(mReboot) resourceId = com.android.internal.R.string.reboot_confirm;      //------------add  this line   
  24.   
  25.   
  26.        if (confirm) {  
  27.            final CloseDialogReceiver closer = new CloseDialogReceiver(context);  
  28.            if (sConfirmDialog != null) {  
  29.                sConfirmDialog.dismiss();  
  30.            }  
  31.            //if (sConfirmDialog == null) {                 //-----------------------modify this line  
  32.                Log.d(TAG, "PowerOff dialog doesn't exist. Create it first");  
  33.                sConfirmDialog = new AlertDialog.Builder(context)  
  34.                    .setTitle(mRebootSafeMode  
  35.                            ? com.android.internal.R.string.reboot_safemode_title  
  36.                            : (mReboot?com.android.internal.R.string.reboot:com.android.internal.R.string.power_off))//modify this line .添加判断重启  
  37.                    .setMessage(resourceId)  
  38.                    .setPositiveButton(com.android.internal.R.string.yes, new DialogInterface.OnClickListener() {  
  39.                            public void onClick(DialogInterface dialog, int which) {  
  40.                            beginShutdownSequence(context);  
  41.                            if (sConfirmDialog != null) {  
  42.                            sConfirmDialog = null;  
  43.                            }  
  44.                            }  
  45.                            })  
  46.                .setNegativeButton(com.android.internal.R.string.no, new DialogInterface.OnClickListener() {  
  47.                        public void onClick(DialogInterface dialog, int which) {  
  48.                        synchronized (sIsStartedGuard) {  
  49.                        sIsStarted = false;  
  50.                        }  
  51.                        if (sConfirmDialog != null) {  
  52.                        sConfirmDialog = null;  
  53.                        }  
  54.                        }  
  55.                        })  
  56.                .create();  
  57.                sConfirmDialog.setCancelable(false);//blocking back key  
  58.                sConfirmDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);  
  59.                /*if (!context.getResources().getBoolean( 
  60.                  com.android.internal.R.bool.config_sf_slowBlur)) { 
  61.                  sConfirmDialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND); 
  62.                  }*/  
  63.                /* To fix video+UI+blur flick issue */  
  64.                sConfirmDialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);  
  65.           // }                                              //-------------------modify this line  
  66.   
  67.            closer.dialog = sConfirmDialog;  
  68.            sConfirmDialog.setOnDismissListener(closer);  
  69.   
  70.            if (!sConfirmDialog.isShowing()) {  
  71.                sConfirmDialog.show();  
  72.            }  
  73.        } else {  
  74.            beginShutdownSequence(context);  
  75.        }  
  76.    }  

7.添加新的API接口

修改路径:frameworks/base/api/current.txt

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
  1. field public static final int ic_lock_power_off = 17301552; // 0x1080030  
  2. field public static final int ic_lock_reboot = 17301662; // 0x108009e  

8.对所用到的资源进行声明 (这个是Android  4.1版本中的)

修改路径:frameworks/base/core/res/res/values/public.xml

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <public type="drawable" name="ic_lock_reboot" id="0x0108009e" />  

9.以上修改好后,需要对所用到的资源进行声明

修改路径:frameworks/base/core/res/res/values/symbols.xml

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <java-symbol type="string" name="reboot" />  
  2.  <java-symbol type="string" name="reboot_confirm" />  
  3.  <java-symbol type="string" name="global_action_reboot" />  

0 0
原创粉丝点击