1. 程式人生 > >Android4.4關機選單新增重啟系列選項

Android4.4關機選單新增重啟系列選項

本來以為挺簡單的修改,沒想到花了一天的時間,在此記錄下修改過程

首先,定義幾個字串,重啟,正在重啟....


/frameworks/base/core/res/res/values/strings.xml
/frameworks/base/core/res/res/values-zh-rCN/strings.xml

兩個檔案中分別新增定義:

    <string name="global_action_power_reboot">Reboot</string>
    <!-- 安全模式 -->
    <string name="global_action_power_safemode">Safe Mode</string>
    <string name="reboot_progress">"Rebooting..."</string>


    <string name="global_action_power_reboot">重啟</string>
    <string name="global_action_power_safemode">重啟到安全模式</string>
    <string name="reboot_progress">"正在重啟..."</string>


光在這裡定義完是沒用的,之後你在Java程式碼中引用會報錯,所以還要在
/frameworks/base/core/res/res/values/public.xml檔案中新增宣告

  <public type="string" name="global_action_power_reboot" id="0x01040018" />
  <public type="string" name="global_action_power_safemode" id="0x01040019" />
  <public type="string" name="reboot_progress" id="0x0104001a" />

到這裡你以為宣告完了麼?我以為宣告完了,結果到快編譯完時又報錯,根據提示,需要在
/frameworks/base/api/current.txt檔案中宣告API介面,我這不是外部應用,為毛要宣告?那就繼續新增唄

查詢public static final class R.string {宣告,新增定義
    field public static final int global_action_power_reboot = 17039384; // 0x1040018
    field public static final int global_action_power_safemode = 17039385; // 0x1040019
    field public static final int reboot_progress = 17039386; // 0x104001a

這些字串的ID是搜尋沒有定義的ID然後自己編寫上去的,可根據情況進行修改,但在public.xml跟current.txt中保持一致

做完這些才算定義完....

修改程式碼:

/frameworks/base/policy/src/com/android/internal/policy/impl/GlobalActions.java
1. 匯入需要的包

import java.io.File;
import java.io.FileWriter;
import android.os.PowerManager;
import java.io.IOException;

找到函式

private GlobalActionsDialog createDialog()

在mItems = new ArrayList<Action>();後面進行新增

        // 2016-03-03 14:43:58 新增重啟選單
        mItems.add(
            new SinglePressAction(
                    com.android.internal.R.drawable.stat_notify_sync,
                    R.string.global_action_power_reboot) {

                public void onPress() {
                	// 重啟
                	PowerManager pm = (PowerManager)mContext.getSystemService(Context.POWER_SERVICE);  
				    pm.reboot(null); // 呼叫PowerManager類中的reboot方法
                }

                public boolean showDuringKeyguard() {
                    return true;
                }

                public boolean showBeforeProvisioning() {
                    return true;
                }
            });

        // 2016-03-03 14:49:03 新增重啟到安全模式
        mItems.add(
            new SinglePressAction(
                    com.android.internal.R.drawable.ic_print_error,
                    R.string.global_action_power_safemode) {

                public void onPress() {
                	// 重啟到安全模式
                    mWindowManagerFuncs.rebootSafeMode(true);
                }
                
                public boolean onLongPress() {
                	// 長按重啟到Recovery
                	recoveryMode(mContext);
                    return true;
                }

                public boolean showDuringKeyguard() {
                    return true;
                }

                public boolean showBeforeProvisioning() {
                    return true;
                }
            });
其中的圖片資源使用系統現有的,沒有另外進行新增,從新增字串可以想到添加個圖片資源也不省心,乾脆用現有的資源好了

到這裡要說改完了麼?功能都已經實現了,不過關機時顯示的是正在關機,這多少有些差強人意了,那麼就修改

/frameworks/base/services/java/com/android/server/power/ShutdownThread.java檔案

查詢private static void beginShutdownSequence(Context context)函式

        // 修改這段程式碼
        ProgressDialog pd = new ProgressDialog(context);
        pd.setTitle(context.getText(com.android.internal.R.string.power_off));
        pd.setMessage(context.getText(com.android.internal.R.string.shutdown_progress));
        pd.setIndeterminate(true);
        pd.setCancelable(false);
        pd.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
        // 修改後
        ProgressDialog pd = new ProgressDialog(context);
        if (mReboot){
            pd.setTitle(context.getText(com.android.internal.R.string.global_action_power_reboot));
            pd.setMessage(context.getText(com.android.internal.R.string.reboot_progress));
        }
        else{
            pd.setTitle(context.getText(com.android.internal.R.string.power_off));
            pd.setMessage(context.getText(com.android.internal.R.string.shutdown_progress));
        }
        pd.setIndeterminate(true);
        pd.setCancelable(false);
        pd.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
這樣重啟時就會顯示正在重啟進度框了.

要說為什麼之前不直接使用ShutdownThread.reboot方法呢?開始也用了,但是提示未定義錯誤,引用com.android.server.power.ShutdownThread也沒用,

最後使用了PowerManager介面了.... 

PS: 我就知道Android不會這麼弱,是我太菜....

自定義的字元不需要在public.xml跟current.txt中宣告,

到檔案:/frameworks/base/core/res/res/values/symbols.xml中進行宣告即可

  <java-symbol type="string" name="global_action_power_reboot" />
  <java-symbol type="string" name="global_action_power_safemode" />
  <java-symbol type="string" name="reboot_progress" />
  <java-symbol type="drawable" name="perm_group_sync_settings" />
  <java-symbol type="drawable" name="ic_dialog_alert_holo_dark" />
也不用自定義ID什麼的,就這麼簡單,圖片也可以自定義....