<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                那么IStatusBarService的真身如何呢?它的實現者是StatusBarManagerService。由于狀態欄導航欄與它的關系十分密切,因此需要對其有所了解。 與WindowManagerService、InputManagerService等系統服務一樣,StatusBarManagerService在ServerThread中創建。參考如下代碼: **SystemServer.java-->ServerThread.run()** ``` public void run() { try { /* 創建一個StatusBarManagerService的實例,并注冊到ServiceManager中使其成為 一個系統服務 */ statusBar = new StatusBarManagerService(context, wm); ServiceManager.addService(Context.STATUS_BAR_SERVICE, statusBar); } catch(Throwable e) {......} } 再看其構造函數: [StatusBarManagerService.java-->StatusBarManagerService.StatusBarManagerService()] public StatusBarManagerService(Context context,WindowManagerService windowManager) { mContext= context; mWindowManager = windowManager; // 監聽實體鍵盤的狀態變化 mWindowManager.setOnHardKeyboardStatusChangeListener(this); // 初始化狀態欄的系統狀態區的狀態圖標列表。關于系統狀態區的工作原理將在7.2.3節介紹 finalResources res = context.getResources(); mIcons.defineSlots(res.getStringArray( com.android.internal.R.array.config_statusBarIcons)); } ``` 這基本上是系統服務中最簡單的構造函數了,在這里并沒有發現能夠揭示StatusBarManagerService的工作原理的線索(由此也可以預見StatusBarManagerService的實現十分簡單)。 接下來參考StatusBarManagerService.registerStatusBar()的實現。這個方法由SystemUI中的BaseStatusBar調用,用于建立其與StatusBarManagerService的通信連接,并取回保存在其中的信息副本。 **StatusBarManagerService.java-->StatusBarManagerService.registerStatusBar()** ``` public void registerStatusBar(IStatusBar bar,StatusBarIconList iconList, List<IBinder> notificationKeys,List<StatusBarNotification> notifications, intswitches[], List<IBinder> binders) { /* 首先是權限檢查。狀態欄與導航欄是Android系統中一個十分重要的組件,因此必須避免其他應用 調用此方法對狀態欄與導航欄進行偷梁換柱。因此要求方法的調用者必須具有一個簽名級的權限 android.permission.STATUS_BAR_SERVICE*/ enforceStatusBarService(); /* **① 將bar參數保存到mBar成員中。**bar的類型是IStatusBar,它即是BaseStatusBar中的 CommandQueue的Bp端。從此之后,StatusBarManagerService將通過mBar與BaseStatusBar 進行通信。因此可以理解mBar就是SystemUI中的狀態欄與導航欄 */ mBar =bar; // **② 接下來依次為調用者返回信息副本** // 系統狀態區的圖標列表 synchronized (mIcons) { iconList.copyFrom(mIcons); } // 通知區的通知信息 synchronized (mNotifications) { for(Map.Entry<IBinder,StatusBarNotification> e: mNotifications.entrySet()) { notificationKeys.add(e.getKey()); notifications.add(e.getValue()); } } //switches中的雜項 synchronized (mLock) { switches[0] = gatherDisableActionsLocked(mCurrentUserId); ...... } ...... } ``` 可見StatusBarManagerService.registerStatusBar()的實現也十分簡單。主要是保存BaseStatusBar中的CommandQueue的Bp端到mBar成員之中,然后再把信息副本填充到參數里去。盡管簡單,但是從其實現中可以預料到StatusBarManagerService的工作方式:當它接受到操作狀態欄與導航欄的請求時,首先將請求信息保存到副本之中,然后再將這一請求通過mBar發送給BaseStatusBar。以設置系統狀態區圖標這一操作為例,參考如下代碼: **StatusBarManagerService.java-->StatusBarManagerService.setIcon()** ``` public void setIcon(String slot, StringiconPackage, int iconId, int iconLevel, String contentDescription) { /* 首先一樣是權限檢查,與registerStatusBar()不同,這次要求的是一個系統級別的權限 android.permission.STATUS_BAR。因為設置系統狀態區圖標的操作不允許普通應用程序進行。 其他的操作諸如添加一條通知則不需要此權限 */ enforceStatusBar(); synchronized (mIcons) { intindex = mIcons.getSlotIndex(slot); ...... StatusBarIcon icon = new StatusBarIcon(iconPackage, UserHandle.OWNER,iconId, iconLevel, 0, contentDescription); // **① 將圖標信息保存在副本之中** mIcons.setIcon(index, icon); // **② 將設置請求發送給BaseStatusBar** if(mBar != null) { try { mBar.setIcon(index, icon); } catch (RemoteException ex) {......} } } } ``` 縱觀StatusBarManagerService中的其他方法,會發現它們與setIcon()方法的實現十分類似。從而可以得知StatusBarManagerService的作用與工作原理如下: - 它是SystemUI中的狀態欄與導航欄在system\_server中的代理。所有對狀態欄或導航來有需求的對象都可以通過獲取StatusBarManagerService的實例或Bp端達到其目的。只不過使用者必須擁有能夠完成操作的相應權限。 - 它保存了狀態欄/導航欄所需的信息副本,用于在SystemUI意外退出之后的恢復。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看