android reboot 功能的添加

最近做一款手機,需要添加一個手機重啓功能,後來查看源碼發現,代碼中有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。



其實重啓也沒那麼多的代碼,其中大部分代碼也是爲了顯示想關機一樣有效果。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章