最近做一款手機,需要添加一個手機重啓功能,後來查看源碼發現,代碼中有reboot功能,只需要我們添加可視的界面就可以了,現在講我添加的代碼複製在上面,方便以後查閱。
添加這個功能主要用到了兩個類:
frameworks\base\policy\src\com\android\internal\policy\impl\GlobalActions.java
frameworks\base\core\java\com\android\internal\app\ShutdowThread.java
1.首先改GlobalActions.java
我們在CreateDialog()方法裏面的:new SinglePressAction前面添加
new SinglePressAction(
com.android.internal.R.drawable.ic_lock_reboot,
R.string.global_action_reboot) {
public void onPress() {
// shutdown by making sure radio and power are handled accordingly.
ShutdownThread.reboot(mContext, "click",true);
}
public boolean showDuringKeyguard() {
return true;
}
public boolean showBeforeProvisioning() {
return true;
}
},
其中上面的代碼是copy第一個new SinglePressAction的。只是需要把裏面的資源換成重啓的東西。
2.修改ShutdownThread.java
添加下面方法:
private static void reboot(final Context context, boolean confirm) {
// ensure that only one thread is trying to power down.
// any additional calls are just returned
Log.d(TAG, "!!! Request to shutdown !!!");
if (SystemProperties.getBoolean("ro.monkey", false)) {
Log.d(TAG, "Cannot request to shutdown when Monkey is running, returning.");
return;
}
synchronized (sIsStartedGuard) {
if (sIsStarted) {
Log.d(TAG, "Request to shutdown already running, returning.");
return;
}
}
Log.d(TAG, "Notifying thread to start radio shutdown");
bConfirmForAnimation = confirm;
if (confirm) {
final AlertDialog dialog = new AlertDialog.Builder(context)
.setIcon(android.R.drawable.ic_dialog_alert)
.setTitle(com.android.internal.R.string.reboot)
.setMessage(com.android.internal.R.string.reboot_confirm)
.setPositiveButton(com.android.internal.R.string.yes, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
beginShutdownSequence(context,false);
}
})
.setNegativeButton(com.android.internal.R.string.no, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
synchronized (sIsStartedGuard) {
sIsStarted = false;
}
}
})
.create();
dialog.setCancelable(false);//blocking back key
dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
if (!context.getResources().getBoolean(
com.android.internal.R.bool.config_sf_slowBlur)) {
dialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND);
}
dialog.show();
} else {
beginShutdownSequence(context,false);
}
}
其中這個方法是copy shutdown的方法。其中裏面的資源換成reboot的資源,其中會發現beginShutdownSequence變成雙參了,這就是下一步需要改的
3.將beginShutdownSequence函數變成雙參,其中第二參數是boolean類型的,(這個參數的作用是識別是關機還是重啓,關機時true,重啓是false)
下面這個只是改過的代碼片段,其中只是改一部分就行了。
if (shutdown) {
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);
if (!context.getResources().getBoolean(
com.android.internal.R.bool.config_sf_slowBlur)) {
pd.getWindow().addFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND);
}
pd.show();
} else {
pd = new ProgressDialog(context);
pd.setTitle(context.getText(com.android.internal.R.string.reboot));
pd.setMessage(context.getText(com.android.internal.R.string.reboot_progress));
pd.setIndeterminate(true);
pd.setCancelable(false);
pd.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
if (!context.getResources().getBoolean(
com.android.internal.R.bool.config_sf_slowBlur)) {
pd.getWindow().addFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND);
}
pd.show();
}
這個就是當確定後,對reboot和shutdown顯示的不一樣而已。
4.這一步的話,我們發現,其實我們已經把beginShutdownSequence變成雙參了,那麼我們需要在調用他的地方也變成雙參,其中遵循的原則是reboot是false,而shutdown是true;
5,。將reboot(1,2,3)裏面調用shutdown的函數註釋掉,而是調用我們第二步的reboot(,true);
6.就是你在上面中所以的資源東西都是要自己給framework中添加的了,這個可不要忘了。
以上就是在系統中添加一個重啓功能,其中可能有一些紕漏,望大家積極指正,以上代碼在本人機器人測試ok。
其實重啓也沒那麼多的代碼,其中大部分代碼也是爲了顯示想關機一樣有效果。