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什麼的,就這麼簡單,圖片也可以自定義....