android reboot 功能的添加

fmms 12年前發布 | 31K 次閱讀 Android Android開發 移動開發

最近做一款手機,需要添加一個手機重啟功能,后來查看源碼發現,代碼中有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;
                }
            },</pre><br />

其中上面的代碼是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);
    }
}</pre><br />


其中這個方法是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();
        }</pre><br />


     這個就是當確定后,對reboot和shutdown顯示的不一樣而已。

4.這一步的話,我們發現,其實我們已經把beginShutdownSequence變成雙參了,那么我們需要在調用他的地方也變成雙參,其中遵循的原則是reboot是false,而shutdown是true;

5,。將reboot(1,2,3)里面調用shutdown的函數注釋掉,而是調用我們第二步的reboot(,true);

6.就是你在上面中所以的資源東西都是要自己給framework中添加的了,這個可不要忘了。

以上就是在系統中添加一個重啟功能,其中可能有一些紕漏,望大家積極指正,以上代碼在本人機器人測試ok。

 

 

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

轉自:http://blog.csdn.net/duer8797/article/details/7268562

 本文由用戶 fmms 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!