1. 程式人生 > >Android菜鳥之學習android原始碼之三(修改系統預設橫屏)

Android菜鳥之學習android原始碼之三(修改系統預設橫屏)

好多小夥伴在開發平板產品的時候都會接到把系統預設豎屏改成預設橫屏的任務,網上查了許多的文章,有說改底層的c++檔案的,有說改系統編譯出來的一些配置檔案的,眾說紛紜,我當初也踩過了不少的坑,最終發現一種比較靠譜的方式,那就是修改WindowManagerService,這個類是位於framework裡的,修改後需要對整個framework進行模組編譯後替換掉系統的framework.jar這個包,這個類的具體路徑是

platform\frameworks\base\services\core\java\com\android\server\wm\WindowManagerService.class
具體改動的地方看程式碼吧,

   public int getOrientationFromWindowsLocked() {
        ....
        -- return (mLastWindowForcedOrientation=ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
        ++ return (mLastWindowForcedOrientation=ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
    }
  /*
     * Determine the new desired orientation of
the display, returning * a non-null new Configuration if it has changed from the current * orientation. IF TRUE IS RETURNED SOMEONE MUST CALL * setNewConfiguration() TO TELL THE WINDOW MANAGER IT CAN UNFREEZE THE * SCREEN. This will typically be done for you if you call * sendNewConfiguration(). * * The orientation is
computed from non-application windows first. If none of * the non-application windows specify orientation, the orientation is computed from * application tokens. * @see android.view.IWindowManager#updateOrientationFromAppTokens( * android.os.IBinder) */ boolean updateOrientationFromAppTokensLocked(boolean inTransaction) { long ident = Binder.clearCallingIdentity(); try { int req = getOrientationFromWindowsLocked(); if (req == ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED) { -- mForcedAppOrientation = req; -- req = getOrientationFromAppTokensLocked(); ++req=ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; } if (req != mForcedAppOrientation) { -- mForcedAppOrientation = req; ++ mForcedAppOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; .... }
    boolean computeScreenConfigurationLocked(Configuration config) {

....
        if (config != null) {
            -- config.orientation = (dw <= dh) ? Configuration.ORIENTATION_PORTRAIT:Configuration.ORIENTATION_LANDSCAPE;
            ++ config.orientation = Configuration.ORIENTATION_LANDSCAPE;
        }

....
        return true;
    }

修改這幾處程式碼便能把系統預設的豎屏變成橫屏,但是會有其他的應用出現問題,比如撥號盤原本豎屏顯示的,但是在這種橫屏模式下開啟撥號盤會報空指標錯誤,進原始碼一看原來撥號盤也準備了兩套的佈局,一套橫屏一套豎屏的,單獨修改windowmanagerservice後不知道為什麼這些系統應用沒有變成豎屏模式,或許是時間倉促,並沒有對windowmanagerservice的流程作很詳細的分析,以後有時間再找機會研究下這個流程吧。