今天要說的是為Android裝置添加重新開機、飛行模式、靜音模式按鈕,客戶需求中需要添加這項功能,在長按電源鍵彈出的菜單中沒有這些選項,謹以此文記錄自己添加這個功能的過程。
首先找到長按電源鍵彈出的對話框,在frameworks\base\policy\src\com\android\internal\policy\impl\GlobalActions.java檔案中,修改createDialog()方法。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICdzFWRoRXdvN1LclHdpZXYyd2LcBzNvwVZ2x2bzNXak9CX90TQNNkRrFlQKBTSvwFbslmZvwFMwQzLcVmepNHdu9mZvwFVywUNMZTY18CX052bm9CX9MWbixmQzglb1cVW1Y1MiZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39zM0gTOzEzMxEzMxgDMzEDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
在GlobalActionsDialog方法可以看 mItems.add這個方法是添加菜單選項的,該菜單的添加的第一個選項就是關機選項。可以仿照關機的Item添加一個重新開機的選項,如上面的代碼所示;這樣就解決了在長按的電源鍵彈出的對話框中添加一個重新開機選項了。當然這僅僅是添加一個顯示而已,接下來就為這個選項添加邏輯控制代碼了。
在上面的代碼中使用的mWindowManagerFuncs.reboot方法和R.string.global_action_reboot資源(資源的添加放到最後說),預設是不存在的,是以需要在自己手動添加。
2、首先在找到WindowManagerFuncs這個所在的位置,在frameworks\base\core\java\android\view\WindowManagerPolicy.java中
添加reboot方法。但這隻是添加接口而已,它的具體實作在呢?找了許久在frameworks\base\services\java\com\android\server\wm\windowManagerService.java中找到了這個接口的實作。
在該類中加入reboot()方法,該方法調用ShutdownThread的reboot方法
同樣在仿照關機的原理添加reboot的具體實作代碼,既然在ShutdownThread這個類中提供了shutdown和rebootSafeMode的方法,那按理也應該有reboot的方法,或者類似reboot的方法。找到Shutdown.java檔案,在frameworks\base\services\java\com\android\server\power\ShutdownThread.java中,
其中提供了一個靜态的reboot方法,是以在windowManagerService.java中的reboot實作中直接調用ShutdownThread中reboot即可。
public static void reboot(final Context context, String reason, boolean confirm);有三個參數,後兩個參數解釋如下: reason 如果值為是null,正常重新開機;如果是recovery,系統重新開機進入recovery mode ;confirm為true顯示關機提示框,需要使用者【确認】;false不顯示提示框,直接關機。
到此重新開機功能基本上可以使用了(除資源還沒有添加之外),但是此時選擇重新開機選項時,其提示還是不夠關機的提示,是以還要修改選擇“重新開機”時的對話框的提示。
在frameworks\base\services\java\com\android\server\pm\ShutdownThread.java中
修改shutdownInner方法
至此關于代碼部分的改動全部完成,接下就添加需要添加使用到的資源了,就是其中使用的字元串,為了簡單起見就添加了英文和簡體中文:
在對應的資源檔案中添加:
frameworks\base\core\res\res\values\strings.xml
frameworks\base\core\res\res\values-zh-rCN\strings.xml
現在已經添加了好這些資源,但是現在還不能使用,此時編譯會出現找不到該資源的錯誤,還需要在frameworks\base\core\res\res\values\public.xml檔案中進行資源聲明:
最後還得确認 framework/base/core/res/res/values/config.xml檔案中的config_longPressOnPowerBehavior屬性變成1
最後重新編譯即可
==================================================================================================
作者:歐陽鵬 歡迎轉載,與人分享是進步的源泉!