1. 程式人生 > >android4.2新增重啟選單項

android4.2新增重啟選單項

本文主要是針對android4.2關機選單新增重啟功能


A.關機提示
android4.2/frameworks/base/policy/src/com/android/internal/policy/impl/GlobalActions.java
        private void handleShow() {
             // 本函式不需要修改...
             awakenIfNecessary();
             mDialog = createDialog();
             prepareDialog();
             WindowManager.LayoutParams attrs = mDialog.getWindow().getAttributes();
             attrs.setTitle("GlobalActions");
             mDialog.getWindow().setAttributes(attrs);
             mDialog.show();// 關機選擇對話方塊

             mDialog.getWindow().getDecorView().setSystemUiVisibility(View.STATUS_BAR_DISABLE_EXPAND);

             /****************

              如果只需要關機確認可以修改為:
              awakenIfNecessary();
              mWindowManagerFuncs.shutdown(true);

             *******************/
         }

   關機選項選單 找到createDialog() 賦值power off那一項,  修改關機為:         mWindowManagerFuncs.reboot(true);
private GlobalActionsDialog createDialog() {
            ....// 省略
            // first: power off
            mItems.add(
                ....// 省略
               });
/////////////////////////////////////////////////////////////////////////
            // second:reboot  新增這一項  
            try {// 新增try catch 為了避免錯誤...
               mItems.add(
                   new SinglePressAction(
                           com.android.internal.R.drawable.ic_lock_power_off,
                           R.string.global_action_reboot) {

                       public void onPress() {
                           // shutdown by making sure radio and power are handled accordingly.
            //                    mWindowManagerFuncs.rebootSafeMode(true);
                       //    mWindowManagerFuncs.reboot(mContext,null,false);
                       //    ShutdownThread.reboot(mContext,null,false);
                           try {
                               mWindowManagerFuncs.reboot(true);
                           } catch (Exception e) {
                               // TODO: handle exception  如果有問題, 最好在這裡列印一些資訊看看是不是這裡出問題了
                           }

                       }

                       public boolean showDuringKeyguard() {
                           return true;
                       }

                       public boolean showBeforeProvisioning() {
                           return true;
                       }
                           });
                        } catch (Exception e) {
                           // TODO: handle exception  
                        }
                    }
                    <pre name="code" class="java">              /////////////////////////////////////////////////////////////////////////

 ........//省略 B. 1)    android4.2/frameworks/base/core/java/android/view/WindowManagerPolicy.java    找到WindowManagerFuncs這個interface的定義,增加如下function的宣告:
    public interface WindowManagerFuncs {

        public void reboot(boolean confirm);

    }
 
    2)
    android4.2/frameworks/base/services/java/com/android/server/wm/WindowManagerService.java

    找到shutdown()函式,在其後面新增reboot()函式,函式內容如下:

    // Called by window manager policy. Not exposed externally.

    @Override

    public void reboot(boolean confirm) {

        ShutdownThread.reboot(mContext, confirm);

    }


C. 修改關機時的進度框提示

      android4.2/frameworks/base/services/java/com/android/server/power/ShutdownThread.java

 
     /*/
      //修改前:
      ……
       pd.setTitle(context.getText(com.android.internal.R.string.power_off));
       pd.setMessage(context.getText(com.android.internal.R.string.shutdown_progress));
      ……
      /*/
      //修改後:
      ……
      if(mReboot){     // reboot progress
               pd.setTitle(context.getText(com.android.internal.R.string.global_action_reboot));
               pd.setMessage(context.getText(com.android.internal.R.string.reboot_progress));
           }else{          // shutdown progress
               pd.setTitle(context.getText(com.android.internal.R.string.power_off));
               pd.setMessage(context.getText(com.android.internal.R.string.shutdown_progress));
           }
      ……
      //*/


D.  重啟詢問對話方塊   // 這部分可能程式碼不一樣  不過都是修改shutdownInner函式裡面的sConfirmDialog這個dialog的

 
shutdownInner(final Context context, boolean confirm)// 
      if(Settings.Global.getInt(context.getContentResolver(), Settings.Global.DEVICE_PROVISIONED, 1)==1 &&
          SystemProperties.getBoolean("ro.sys.bootfast", false)){
              ......
              // 這部分可能程式碼不一樣  不過都是修改sConfirmDialog這個dialog的
              if(mReboot){
                  idBootMode = com.android.internal.R.string.reboot_confirm_question;
              }else{
                  idBootMode = com.android.internal.R.string.shutdown_confirm_question;
              }
              sConfirmDialog = new AlertDialog.Builder(context)
                  .setTitle(mReboot
                      ? com.android.internal.R.string.global_action_reboot
                      : com.android.internal.R.string.power_off)
                  .setMessage(idBootMode)
                  .setPositiveButton(com.android.internal.R.string.yes, new DialogInterface.OnClickListener() {
                  public void onClick(DialogInterface dialog, int which) {
                      if(mPolicy!=null)
                          mPolicy.acquireBAView();
                      beginShutdownSequence(context);
                  }
                  })
                  .setNegativeButton(com.android.internal.R.string.no, null)
                  .create();

             }
    /////////////////////說明  無關  只做註釋///////////////////
              // 下面這個函式會殺死所有的activity, 桌面不能殺死"com.android.launcher", 否則就會導致關機的時候顯示開機動畫
              private  void killRemoveActivity(Context context)

     /////////////////////end說明///////////////////      

F. 重啟功能實現了,但是不能到此結束,定製Android系統的重啟功能,新增選項和修改重啟提示框時加入了“重啟”和“正在重啟”的字串,
   所以會涉及到在系統資原始檔中新增新的字串,
   原始碼中資原始檔涉及到的多國語言直接忽略,我只在values/strings.xml和values-zh-rCN/strings.xml兩個檔案中加入對應的字串:

    路徑: framework/base/core/res/res/valuse/   or  framework/base/core/res/res/values-zh-rCN/

  上面是拷貝別人的,  實際上我發現如果不在symbols.xml新增相關的字串資訊,  編譯會報錯的,  故應該在framework/base/core/res/res/valuse/ symbols.xml參考其他的把自己的新增上:

   strings.xml:
        <string name="reboot_confirm_question">"Do you want to reboot?"</string>
        <string name="global_action_reboot">"Reboot"</string>
        <string name="reboot_progress">"Rebooting..."</string>

    symbols.xml
        <java-symbol type="string" name="reboot_confirm_question" />
        <java-symbol type="string" name="global_action_reboot" />
        <java-symbol type="string" name="reboot_progress" />


E.最後編譯
因為修改涉及到系統資原始檔又涉及到policy.jar包,經過多次嘗試,正確的編譯順序如下:
步驟1.編譯frameworks/base/res,在out/target/product/X裝置名X/system/framework/目錄下生成framework-res.apk
步驟2.編譯frameworks/base/,在o同樣目錄下生成framework.jar包(不能忽略,不然步驟3編譯報錯)
步驟3.編譯frameworks/base/services/java/     生成services.jar

步驟4.編譯frameworks/base/policy,在同樣目錄下生成android.policy.jar 包

參考:

http://blog.csdn.net/zzp16/article/details/7829063

http://www.2cto.com/kf/201403/288710.html

相關推薦

android4.2新增單項

本文主要是針對android4.2關機選單新增重啟功能 A.關機提示 android4.2/frameworks/base/policy/src/com/android/internal/policy/impl/GlobalActions.java p

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

本來以為挺簡單的修改,沒想到花了一天的時間,在此記錄下修改過程 首先,定義幾個字串,重啟,正在重啟.... 在 /frameworks/base/core/res/res/values/strings.xml /frameworks/base/core/res/res/va

Centos6.2 強制系統後導致系統文件損壞系統無法啟動

centos6.2 強制重啟系統後導致系統文件損壞系統無法啟動 Centos6.2 強制重啟系統後導致系統文件損壞系統無法啟動今天遇到一個比較尷尬的問題,一個客戶的服務器由於服務器被強制重啟造成磁盤損壞,在次啟動服務器的時候發現報錯系統無法啟動.啟動到這裏提示輸入密碼,尷尬的是客戶竟

記一次RAC資料節點2自動故障解決

        最近生產上出了很多“奇怪”的問題,比如下面要分享的一個故障,一套11.2.0.4 兩節點RAC資料庫,2節點的叢集元件會不定日期的重啟,但重啟的時間段比較固定,都是凌晨4:50左右。而且幾分鐘就會恢復

Ubuntu 新增右鍵單項

經常遇到需要用某個指令碼或可執行檔案開啟檔案的情況,在 ubuntu 中,經常是 open-in-terminal,然後執行相應命令,想起之前一個工具的 readme 中處理過新增到右鍵的辦法,查詢一下相關用法: 在$HOME/.local/share/nau

多多小程式釋出 2.0.1,新增編譯,,實時日誌功能

   多多(doodoo)小程式釋出 2.0.1,新增編譯,重啟,實時日誌功能 1、應用列表新增刪除和修改應用名稱功能;     2、新零售新增&ldquo;社群團購&rdquo;模板;     3、點選事件&am

Linux 7個運行級別(0:關機,停機模式、1:單用戶模式、2:多用戶模式、3:完整的多用戶文本模式、4:系統未使用,保留一般不用、5:圖形化模式、6:模式)、置root密碼方法

oca alt 開機重啟 正常 說明 特殊情況 其中 ice root權限 init是Linux系統操作中不可缺少的程序之一。init進程,它是一個由內核啟動的用戶級進程。內核會在過去曾使用過init的幾個地方查找它,它的正確位置(對Linux系統來說)是/

在不的情況下新增一塊磁盤中出現的問題以及掛載到對應的目錄下的詳細解決方法

不重啟 情況下 新增一塊 在vm中添加一塊新磁盤:[[email protected] ~]# fdisk -l 進行掃描,但找不到新增的磁盤解決方法:[[email protected] ~]# ls /sys/class/scsi_host/ 查看總線主機號 [

無限嘗試次數並在前三次進行告警2小時後輪詢腳本

shell#!/bin/bash##1.當tomcat沒在運行時執行重啟並前三次重啟告警##2.三次告警後會繼續執行重啟tomcat,但不在告警##3.每兩個小時候後會重復 1 2 動作export.utf8IP=`/sbin/ip add|grep "inet" |sed -n '

《Linux學習並不難》Linux字符界面(2):關閉和Linux系統之shutdown命令

Linux shutdown 關機 3.2 《Linux學習並不難》Linux字符界面(2):關閉和重啟Linux系統之shutdown命令shutdown命令可以安全地關閉或重啟Linux系統,有些用戶會使用直接斷掉電源的方式來關閉計算機,這是十分危險的。Linux系統與Windows不同,其

CentOS 7.2網絡報錯 Failed to start LSB: Bring up/down

script 3.5 dhcp ifcfg ron centos str sys 日誌 CentOS 7.2重啟網絡報錯 Failed to start LSB: Bring up/down 我的虛擬機原本有兩塊網卡,一塊叫eno16777736,另一塊叫eno5033

[2]supervisor的使用管理:實現對異常中斷的子進程的自動(以redis為例)

program usr AI turn red 重新啟動 自動 t權限 可執行文件 1:下載wget http://download.redis.io/releases/redis-3.2.8.tar.gz1下載指定版本,可以登錄https://redis.io/downl

Spring Boot 1.X和2.X優雅彩38平臺出租實戰

main pau ble eas ren 超過 kill -9 tst 兼容 項目在彩38平臺出租 haozbbs.com Q1446595067 重新發布的過程中,如果有的請求時間比較長,還沒執行完成,此時重啟的話就會導致請求中斷,影響業務功能,優雅重啟可以保證在停止的時

1.報出問題: Please change caller according to com.intellij.openapi.project. IndexNotReadyException documentation 2.分析問題: 提示資訊,不影響編譯 3.解決方案: AS

1.報出問題: Please change caller according to com.intellij.openapi.project. IndexNotReadyException documentation 2.分析問題: 提示資訊,不影響編譯 3.解

實戰:CentOS不,線上新增硬碟

轉載自:http://blog.51cto.com/skypegnu1/1429375 大綱 1、通過VMware Workstation為虛擬機器新增硬碟 2、強制Linux掃描SCSI裝置   系統版本   OS

每次電腦都要重新配置JDK10.0.2(Win10)

配置時要注意三個地方: 1、在系統變數中新建一個變數變數名字是JAVA_HOME,變數值是jdk的安裝路徑 2、找到CLASSPATH,沒有到話就新建一個,變數名為CLASSPATH 變數值為 .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.ja

Win10設定不能儲存,新增應用磁貼後恢復原狀問題

最近用公司的電腦win10系統,發現設定不能儲存,新增的磁貼應用重啟後又恢復新增之前的樣子。感覺很奇怪,因為以前是可以的,突然就不能儲存了,度娘了很久也沒解決,用powershell重置也不行,今天google了一下,找到了解決方法,開啟登錄檔定位 HKEY_CURRENT_USER\Softw

mysql5.7 yum安裝及主從配置(從庫只讀),不主庫新增從庫配置

yum -y remove mysql wget http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm rpm -ivh mysql57-community-release-el7-8.noarch.rpm yum -y ins

安卓點home鍵

主要原因是:每次啟動Intent導致新建立Task的時候,該Task會記錄導致其建立的Intent;而如果後續需要有一個新的與建立Intent完全一致(完全一致定位為:啟動類,action、category等等全部一樣,不可多項也不可缺少),那麼該Intent並不會觸發Activity的新建啟動,而只會將已經

如何解決CentOS 7.2後/etc/resolv.conf被置的問題

一、 修改網絡卡配置,增加“PEERDNS=no” vi /etc/sysconfig/network-scripts/ifcfg-eth0 PEERDNS=no這個選項可令 /etc/resolv.conf 在系統重啟後不會被重寫。 二、修改 /etc/resol