精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Wms 啟動流程分析和介紹

系統 Windows
客戶端開發中并不是直接和 WindowManagerService 交互,而是直接和本地對象 WindowManager 交互,然后由 WindowManager 完成和 WindowManagerService 的交互。

[[433507]]

前言

客戶端開發中并不是直接和 WindowManagerService 交互,而是直接和本地對象 WindowManager 交互,然后由 WindowManager 完成和 WindowManagerService 的交互;

對于 Android 應用來說這個交互是透明的,應用感覺不到 WindowManagerService 的存在;

我們來介紹分析下窗口管理服務 WindowManagerService 的啟動過程;

一、WindowManagerService的相關類

1、WindowManagerService概念

Framework層的窗口管理服務,職責是管理Android系統中所有window;窗口管理服務,繼承IWindowManager.Stub,Binder服務端,因此WM與WMS的交互也是一個IPC過程。WMS主要做的事情如下:

  • Z-ordered的維護函數
  • 輸入法管理
  • AddWindow/RemoveWindow
  • Layerout
  • Token管理,AppToken
  • 活動窗口管理(FocusWindow)
  • 活動應用管理(FocusApp)
  • 轉場動畫
  • 系統消息收集線程
  • 系統消息分發線程

2、WindowManager

應用與窗口管理服務WindowManagerService交互的接口

3、PhoneWindowManager

實現了窗口的各種策略,定義了窗口相關策略;

4、Choreographer

用戶控制窗口動畫、屏幕選擇等操作,它擁有從顯示子系統獲取Vsync同步事件的能力,從而可以在合適的時機通知渲染動作,避免在渲染的過程中因為發生屏幕重繪而導致的畫面撕裂。WMS使用Choreographer負責驅動所有的窗口動畫、屏幕旋轉動畫、墻紙動畫的渲染;

5、DisplayContent

  • 用于描述多屏輸出相關信息;
  • 根據窗口的顯示位置將其分組。隸屬于同一個DisplayContent的窗口將會被顯示在同一個屏幕中。每個DisplayContent都對應著唯一ID,在添加窗口的時候可以通過指定這個ID決定其將顯示在哪個屏幕中;
  • DisplayContent是一個非常具有隔離性的一個概念。處于不同DisplayContent的兩個窗口在布局、顯示順序以及動畫處理上不會產生任何耦合;

6、WindowState

描述窗口的狀態信息以及和WindowManagerService進行通信,一般一個窗口對應一個WindowState。它用來表示一個窗口的所有屬性;

7、WindowToken

  • 窗口Token,用來做Binder通信;同時也是一種標識;
  • 在進行窗口Zorder排序時,屬于同一個WindowToken的窗口會被安排在一起,而且在其中定義的一些屬性將會影響所有屬于此WindowToken的窗口,這些都表明了屬于同一個WindowToken的窗口之間的緊密聯系;
  • 應用組件在需要新的窗口時,必須提供WindowToken以表明自己的身份,并且窗口的類型必須與所持有的WindowToken的類型一致;
  • 在創建系統類型的窗口時不需要提供一個有效的Token,WMS會隱式地為其聲明一個WindowToken,看起來誰都可以添加個系統級的窗口。難道Android為了內部使用方便而置安全于不顧嗎?非也,addWindow()函數一開始的mPolicy.checkAddPermission()的目的就是如此。它要求客戶端必須擁有SYSTEM_ALERT_WINDOW或INTERNAL_SYSTEM_WINDOW權限才能創建系;

8、Session

App進程通過建立Session代理對象和Session對象通信,進而和WMS建立連接;

9、SurfaceFlinger

SurfaceFlinger負責管理Android系統的幀緩沖區(Frame Buffer),Android設備的顯示屏被抽象為一個幀緩沖區,而Android系統中的SurfaceFlinger服務就是通過向這個幀緩沖區寫入內容來繪制應用程序中的用戶界面的;

10、InputManager

IMS實例。管理每個窗口的輸入事件通道(InputChannel)以及向通道上派發事件

11、Animator

所有窗口動畫的總管(WindowStateAnimator對象)。在Choreographer的驅動下,逐個渲染所有的動畫

二、WMS啟動流程

WMS的啟動,依然是由SystemServer進行啟動,在SystemServer的main函數中調用startOtherServices方法創建WMS;

1、SystemServer#startOtherServices

  1. private void startOtherServices() { 
  2.         ... 
  3.         try { 
  4.             ... 
  5.             // 創建WMS對象 
  6.             // 創建WMS對象需要依賴于InputManager、PhoneWindowManager、和AMS 
  7.             // IMS是用來管理每個窗口的輸入事件通道以及向通道上派發事件 
  8.             // PhoneWindowManager是實現了窗口的各種策略,定義了窗口相關策略 
  9.             // 比如:告訴WMS某一個類型Window的Z-Order的值是多少,幫助WMS矯正不合理的窗口屬性, 
  10.             // 為WMS監聽屏幕旋轉的狀態,預處理一些系統按鍵事件(例如HOME、BACK鍵等的默認行為就是在這里實現的)等 
  11.             wm = WindowManagerService.main(context, inputManager, !mFirstBoot, mOnlyCore, 
  12.                     new PhoneWindowManager(), mActivityManagerService.mActivityTaskManager); 
  13.             ServiceManager.addService(Context.WINDOW_SERVICE, wm, /* allowIsolated= */ false
  14.                     DUMP_FLAG_PRIORITY_CRITICAL | DUMP_FLAG_PROTO); 
  15.             ServiceManager.addService(Context.INPUT_SERVICE, inputManager, 
  16.                     /* allowIsolated= */ false, DUMP_FLAG_PRIORITY_CRITICAL); 
  17.             traceEnd(); 
  18.             traceBeginAndSlog("SetWindowManagerService"); 
  19.             // 將AMS與WMS做綁定 
  20.             mActivityManagerService.setWindowManager(wm); 
  21.             traceEnd(); 
  22.             traceBeginAndSlog("WindowManagerServiceOnInitReady"); 
  23.             // 這里主要是調用initPolicy用來初始化PhoneWindowManager 
  24.             wm.onInitReady(); 
  25.             traceEnd(); 
  26.             ... 
  27.         } 
  28.         ... 
  29.         traceBeginAndSlog("MakeDisplayReady"); 
  30.         try { 
  31.             // 主要是初始化UI尺寸 
  32.             wm.displayReady(); 
  33.         } catch (Throwable e) { 
  34.             reportWtf("making display ready", e); 
  35.         } 
  36.         traceEnd(); 
  37.         ... 
  38.         traceBeginAndSlog("MakeWindowManagerServiceReady"); 
  39.         try { 
  40.             // 準備工作已經完成 
  41.             wm.systemReady(); 
  42.         } catch (Throwable e) { 
  43.             reportWtf("making Window Manager Service ready", e); 
  44.         } 
  45.         traceEnd(); 
  46.         ... 
  47.     } 

2、WindowManagerService#main

  • WMS的main方法:是運行在SystemServer進程的主線程,但是WMS的初始化是在DisplayThread線程構建的;
  • DisplayThread其實就是一個HandlerThread;
  • Handler中有一個runWithScissors方法:這個方法其實就是Handler.post消息執行之后能夠再繼續往下執行;
  • 即runWithScissors后面的內容,需要等待消息的處理完成之后才會繼續執行。其實就是實現一個同步執行的過程;
  • DisplayThread其實是android.display線程,這是系統共享的單例前臺線程,在該線程內部創建了WMS;
  1. public static WindowManagerService main(final Context context, final InputManagerService im, 
  2.             final boolean showBootMsgs, final boolean onlyCore, WindowManagerPolicy policy, 
  3.             ActivityTaskManagerService atm) { 
  4.         return main(context, im, showBootMsgs, onlyCore, policy, atm, 
  5.                 SurfaceControl.Transaction::new); 
  6.     } 
  • WMS的main方法是在SystemServer進程的主線程調用的,然后在調用WMS的main方法的時候,通過DisplayThread這個HandlerThread,實現異步處理;
  • 這里的異步處理,其實是通過跨線程的一個同步,即通過DisplayThread中的Handler對象,調用runWithScissors方法;
  • 該方法其實是可以實現發送消息等待消息處理完成以后再繼續執行runWithScissors方法調用位置之后的代碼,即等待消息處理完之后再進行return WMS對象的返回操作;
  1. @VisibleForTesting 
  2.     public static WindowManagerService main(final Context context, final InputManagerService im, 
  3.             final boolean showBootMsgs, final boolean onlyCore, WindowManagerPolicy policy, 
  4.             ActivityTaskManagerService atm, TransactionFactory transactionFactory) { 
  5.         // wms是運行在android.display線程 
  6.         DisplayThread.getHandler().runWithScissors(() -> 
  7.                 sInstance = new WindowManagerService(context, im, showBootMsgs, onlyCore, policy, 
  8.                         atm, transactionFactory), 0); 
  9.         return sInstance; 
  10.     } 

3、Handler#runWithScissors

上面的runWithScissors傳入的就是一個Runnable實例,只不過是采用了lambda表達式的做法,所以Runnable的run()方法的方法體是就是:

  1. sInstance = new WindowManagerService(context, im, showBootMsgs, onlyCore, policy, 
  2. atm, transactionFactory), 0); 
  3. public final boolean runWithScissors(@NonNull Runnable r, long timeout) { 
  4.     if (r == null) { 
  5.         throw new IllegalArgumentException("runnable must not be null"); 
  6.     } 
  7.     if (timeout < 0) { 
  8.         throw new IllegalArgumentException("timeout must be non-negative"); 
  9.     } 
  10.     // 如果調用runWithScissors方法的線程是與消息處理線程在同一個線程 
  11.     // 則直接執行Runnable的run方法。 
  12.     if (Looper.myLooper() == mLooper) { 
  13.         r.run(); 
  14.         return true
  15.     } 
  16.     // 如果調用runWithScissors方法的線程與消息處理線程不是同一個,則創建一個BlockingRunnable 
  17.     BlockingRunnable br = new BlockingRunnable(r); 
  18.     return br.postAndWait(this, timeout); 
  • 則創建一個BlockingRunnable;
  • 調用BlockingRunnable.postAndWait方法;
  • 這里的返回值會先等待,等待DisplayThread線程中的Handler處理完;
  • 消息之后,然后喚醒BlockingRunnable;
  • 該Handler處理消息是在DisplayThread線程,而BlockingRunnable;
  • 而BlockingRunnable調用wait并不會讓DisplayThread線程中的;
  • Handler等待,Handler依然會處理消息,處理消息其實就是調用了;
  • BlockingRunnable.run()方法,當BlockingRunnable.run()執行完成;
  • 就會調用notifyAll喚醒BlockingRunnable,執行postAndWait的return;

4、BlockingRunnable方法介紹

  1. private static final class BlockingRunnable implements Runnable { 
  2.     private final Runnable mTask; 
  3.     private boolean mDone; 
  4.     public BlockingRunnable(Runnable task) { 
  5.         mTask = task; 
  6.     } 
  7.     @Override 
  8.     public void run() { 
  9.         try { 
  10.             mTask.run(); 
  11.         } finally { 
  12.             synchronized (this) { 
  13.                 mDone = true
  14.                 notifyAll(); 
  15.             } 
  16.         } 
  17.     } 
  18.     public boolean postAndWait(Handler handler, long timeout) { 
  19.         // 調用postAndWait的時候,先調用handler對象的post將消息發送出 
  20.         // 如果入隊成功,則為true,則開始阻塞 
  21.         if (!handler.post(this)) { 
  22.             return false
  23.         } 
  24.         // 在上面的方法調用中,timeout=0,則阻塞。 
  25.         synchronized (this) { 
  26.             if (timeout > 0) { 
  27.                 final long expirationTime = SystemClock.uptimeMillis() + timeout; 
  28.                 // 如果mDone為false的時候,則會等待,只有為true的時候,會執行 
  29.                 while (!mDone) { 
  30.                     long delay = expirationTime - SystemClock.uptimeMillis(); 
  31.                     if (delay <= 0) { 
  32.                         return false; // timeout 
  33.                     } 
  34.                     try { 
  35.                         wait(delay); 
  36.                     } catch (InterruptedException ex) { 
  37.                     } 
  38.                 } 
  39.             } else { 
  40.                 while (!mDone) { 
  41.                     try { 
  42.                         wait(); 
  43.                     } catch (InterruptedException ex) { 
  44.                     } 
  45.                 } 
  46.             } 
  47.         } 
  48.         return true
  49.     } 
  • mTask其實就是runWithScissors中傳入的Runnable對象;
  • BlockingRunnable的run方法的執行,其實就是需要Handler遍歷到消息處理的時候;
  • 然后處理這個BlockingRunnable消息,在處理BlockingRunnable消息的時候;
  • 就會處理runWithScissors的參數中的Runnable這個mTask;
  • 處理完成之后,就會調用notifyAll喚醒等待線程,然后執行postAndWait的return;
  • 因為BlockingRunnable的run方法是由Handler處理消息;
  • 這個消息的處理與BlockingRunnable是在不同的線程;
  • 所以BlockingRunnable等待的時候,其run方法是可以由handler消息處理;

5、WindowManagerService構造器

  1. private WindowManagerService(Context context, InputManagerService inputManager, 
  2.         boolean showBootMsgs, boolean onlyCore, WindowManagerPolicy policy, 
  3.         ActivityTaskManagerService atm, TransactionFactory transactionFactory) { 
  4.     installLock(this, INDEX_WINDOW); 
  5.     mGlobalLock = atm.getGlobalLock(); 
  6.     mAtmService = atm; 
  7.     mContext = context; 
  8.     mAllowBootMessages = showBootMsgs; 
  9.     mOnlyCore = onlyCore; 
  10.     // 各種變量讀取 
  11.     mLimitedAlphaCompositing = context.getResources().getBoolean( 
  12.             com.android.internal.R.bool.config_sf_limitedAlpha); 
  13.     mHasPermanentDpad = context.getResources().getBoolean( 
  14.             com.android.internal.R.bool.config_hasPermanentDpad); 
  15.     mInTouchMode = context.getResources().getBoolean( 
  16.             com.android.internal.R.bool.config_defaultInTouchMode); 
  17.     ...... 
  18.     mInputManager = inputManager; 
  19.     mDisplayManagerInternal = 
  20.         LocalServices.getService(DisplayManagerInternal.class); 
  21.     // Display設置 
  22.     mDisplayWindowSettings = new DisplayWindowSettings(this); 
  23.     mTransactionFactory = transactionFactory; 
  24.     mTransaction = mTransactionFactory.make(); 
  25.     //PhoneWindowManager(繼承于WindowManagerPolicy, 用來提供UI相關的一些行為) 
  26.     mPolicy = policy; 
  27.     // 在一個單獨的task中執行動畫和Surface操作的類 
  28.     mAnimator = new WindowAnimator(this); 
  29.     // 根Window容器 
  30.     mRoot = new RootWindowContainer(this); 
  31.     // 用來確定Window和Surface的位置 
  32.     mWindowPlacerLocked = new WindowSurfacePlacer(this); 
  33.     // 任務快照管理器(當App不可見時, 會將Task的快照以Bitmap形式存在緩存中) 
  34.     mTaskSnapshotController = new TaskSnapshotController(this); 
  35.     LocalServices.addService(WindowManagerPolicy.class, mPolicy); 
  36.     mDisplayManager =  
  37.     (DisplayManager)context.getSystemService(Context.DISPLAY_SERVICE); 
  38.     // Keyguard處理器 
  39.     mKeyguardDisableHandler = 
  40.         KeyguardDisableHandler.create(mContext, mPolicy, mH); 
  41.     // PowerManager是控制設備電池狀態的管理器 
  42.     mPowerManager =  
  43.         (PowerManager)context.getSystemService(Context.POWER_SERVICE); 
  44.     // PowerManagerInternal是PowerMananger的本地服務 
  45.     mPowerManagerInternal = 
  46.         LocalServices.getService(PowerManagerInternal.class); 
  47.     if (mPowerManagerInternal != null) { 
  48.         mPowerManagerInternal.registerLowPowerModeObserver( 
  49.                 new PowerManagerInternal.LowPowerModeListener() { 
  50.             @Override 
  51.             public int getServiceType() { 
  52.                 return ServiceType.ANIMATION; 
  53.             } 
  54.             @Override 
  55.             public void onLowPowerModeChanged(PowerSaveState result) { 
  56.                 synchronized (mGlobalLock) { 
  57.                     // 低電量模式發生變化時, 需要調整對應的動畫 
  58.                     final boolean enabled = result.batterySaverEnabled; 
  59. if (mAnimationsDisabled != enabled && !mAllowAnimationsInLowPowerMode) { 
  60.                         mAnimationsDisabled = enabled; 
  61.                         dispatchNewAnimatorScaleLocked(null); 
  62.                     } 
  63.                 } 
  64.             } 
  65.         }); 
  66.         // 獲取是否允許動畫 
  67.         mAnimationsDisabled = 
  68.             mPowerManagerInternal.getLowPowerState( 
  69.             ServiceType.ANIMATION).batterySaverEnabled; 
  70.     } 
  71.     mScreenFrozenLock = 
  72.     mPowerManager.newWakeLock( 
  73.         PowerManager.PARTIAL_WAKE_LOCK, "SCREEN_FROZEN"); 
  74.     mScreenFrozenLock.setReferenceCounted(false); 
  75.     // 獲取IActivity.Stub.Proxy(new BinderProxy()) 
  76.     mActivityManager = ActivityManager.getService(); 
  77.     // 獲取IActivityTaskManager.Stub.Proxy 
  78.     mActivityTaskManager = ActivityTaskManager.getService(); 
  79.     // ActivityManagerInternal是ActivityManager的本地服務 
  80.     mAmInternal = 
  81.         LocalServices.getService(ActivityManagerInternal.class); 
  82.     // ActivityTaskManagerInternal是ActivityTaskManager的本地服務 
  83.     mAtmInternal = 
  84.         LocalServices.getService(ActivityTaskManagerInternal.class); 
  85.     mAppOps =  
  86.     (AppOpsManager)context.getSystemService(Context.APP_OPS_SERVICE); 
  87.     AppOpsManager.OnOpChangedInternalListener opListener = 
  88.             new AppOpsManager.OnOpChangedInternalListener() { 
  89.                 @Override  
  90.                 public void onOpChanged(int op, String packageName) { 
  91.                     updateAppOpsState(); 
  92.                 } 
  93.             }; 
  94.     mAppOps.startWatchingMode(OP_SYSTEM_ALERT_WINDOW, null, opListener); 
  95.     mAppOps.startWatchingMode(AppOpsManager.OP_TOAST_WINDOW, 
  96.         null, opListener); 
  97.     // PackageManagerInternal是PackageManager的本地服務 
  98.     mPmInternal = LocalServices.getService(PackageManagerInternal.class); 
  99.     // 注冊Package suspend/unsuspend廣播 
  100.     final IntentFilter suspendPackagesFilter = new IntentFilter(); 
  101.     suspendPackagesFilter.addAction(Intent.ACTION_PACKAGES_SUSPENDED); 
  102.     suspendPackagesFilter.addAction(Intent.ACTION_PACKAGES_UNSUSPENDED); 
  103.     context.registerReceiverAsUser(new BroadcastReceiver() { 
  104.         @Override 
  105.         public void onReceive(Context context, Intent intent) { 
  106.             final String[] affectedPackages = 
  107.             intent.getStringArrayExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST); 
  108.             final boolean suspended = 
  109.             Intent.ACTION_PACKAGES_SUSPENDED.equals(intent.getAction()); 
  110.             updateHiddenWhileSuspendedState( 
  111.             new ArraySet<>(Arrays.asList(affectedPackages)), suspended); 
  112.         } 
  113.     }, UserHandle.ALL, suspendPackagesFilter, nullnull); 
  114.     // 獲取并設置window scale設置 
  115.     final ContentResolver resolver = context.getContentResolver(); 
  116.     mWindowAnimationScaleSetting = Settings.Global.getFloat(resolver, 
  117. Settings.Global.WINDOW_ANIMATION_SCALE, mWindowAnimationScaleSetting); 
  118.     ...... 
  119.     // 注冊廣播, 當DevicePolicyManager狀態發生變化時設置keyguard屬性是否可用 
  120.     IntentFilter filter = new IntentFilter(); 
  121.     filter.addAction(ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED); 
  122.     mContext.registerReceiverAsUser(mBroadcastReceiver, 
  123.         UserHandle.ALL, filter, nullnull); 
  124.     mLatencyTracker = LatencyTracker.getInstance(context); 
  125.     mSettingsObserver = new SettingsObserver();  
  126.     ......  
  127.     mSurfaceAnimationRunner = new SurfaceAnimationRunner(mPowerManagerInternal); 
  128.     mAllowTheaterModeWakeFromLayout = context.getResources().getBoolean( 
  129. com.android.internal.R.bool.config_allowTheaterModeWakeFromWindowLayout); 
  130.     // Task定位控制器 
  131.     mTaskPositioningController = new TaskPositioningController(this, 
  132.         mInputManager, mActivityTaskManager, mH.getLooper()); 
  133.     // View的拖/拉操作控制器 
  134.     mDragDropController = new DragDropController(this, mH.getLooper());  
  135.     ...... 
  136.     // 注冊WindowManager的本地服務WindowManagerInternal 
  137.     LocalServices.addService(WindowManagerInternal.class, new LocalService()); 

LocalServices與ServiceManager類似,但是LocalServices只能是在同一個進程中使用;

并且LocalServices中注冊的并不是一個Binder對象,注冊進的都是對應的Service的靜態內部類;

也就是LocalService,比如WMS有一個WindowManagerInternal,LocalService就是其子類實現;

6、onInitReady

  1. public void onInitReady() { 
  2.     // 初始化PhoneWindowManager 
  3.     initPolicy(); 
  4.     // 添加Watchdog monitor 
  5.     Watchdog.getInstance().addMonitor(this);  
  6.     // 調用SurfaceControl.openTransaction(), 啟動一個事務 
  7.     openSurfaceTransaction(); 
  8.     // 創建水印 
  9.     createWatermarkInTransaction(); 
  10.     // 結束事務 
  11. closeSurfaceTransaction("createWatermarkInTransaction");  
  12.     // 顯示模擬器顯示層 
  13.     showEmulatorDisplayOverlayIfNeeded(); 

7、 initPolicy

  1. private void initPolicy() { 
  2.         UiThread.getHandler().runWithScissors(new Runnable() { 
  3.             @Override 
  4.             public void run() { 
  5.                 WindowManagerPolicyThread.set(Thread.currentThread(), 
  6.                     Looper.myLooper()); 
  7.                 mPolicy.init(mContext, WindowManagerService.this, 
  8.                     WindowManagerService.this); 
  9.             } 
  10.         }, 0); 
  11.     } 

PhoneWindowManager 的初始化運行在 “android.ui” 線程;

8、 displayReady

  1. public void displayReady() { 
  2.     synchronized (mGlobalLock) { 
  3.         // 設置RootWindowContainer的Window列表的最大寬度 
  4.         if (mMaxUiWidth > 0) { 
  5.             mRoot.forAllDisplays( 
  6.             displayContent -> displayContent.setMaxUiWidth(mMaxUiWidth)); 
  7.         } 
  8.         final boolean changed = applyForcedPropertiesForDefaultDisplay(); 
  9.         mAnimator.ready(); 
  10.         mDisplayReady = true
  11.         if (changed) { 
  12.             // 重新配置DiaplayContent屬性 
  13.             reconfigureDisplayLocked(getDefaultDisplayContentLocked()); 
  14.         } 
  15.         mIsTouchDevice = mContext.getPackageManager().hasSystemFeature( 
  16.         PackageManager.FEATURE_TOUCHSCREEN); 
  17.     } 
  18.     // 1.修改當前configuration 2.確保當前Activity正在運行當前configuration 
  19.     mActivityTaskManager.updateConfiguration(null); 
  20.     // 更新CircularDisplayMask 
  21.     updateCircularDisplayMaskIfNeeded(); 

9、systemReady

  1. public void systemReady() { 
  2.     mSystemReady = true
  3.     mPolicy.systemReady(); 
  4.     mRoot.forAllDisplayPolicies(DisplayPolicy::systemReady); 
  5.     mTaskSnapshotController.systemReady(); 
  6.     // 是否支持色域 
  7.     mHasWideColorGamutSupport = queryWideColorGamutSupport(); 
  8.     // 是否支持HDR渲染 
  9.     mHasHdrSupport = queryHdrSupport(); 
  10.     UiThread.getHandler().post(mSettingsObserver::updateSystemUiSettings); 
  11.     UiThread.getHandler().post(mSettingsObserver::updatePointerLocation); 
  12.     // 獲取IVrManager.Stub.Proxy, 并注冊狀態變化listener 
  13.     IVrManager vrManager = IVrManager.Stub.asInterface( 
  14.             ServiceManager.getService(Context.VR_SERVICE)); 
  15.     if (vrManager != null) { 
  16.         final boolean vrModeEnabled = vrManager.getVrModeState(); 
  17.         synchronized (mGlobalLock) { 
  18.             vrManager.registerListener(mVrStateCallbacks); 
  19.             if (vrModeEnabled) { 
  20.                 mVrModeEnabled = vrModeEnabled; 
  21.                 mVrStateCallbacks.onVrStateChanged(vrModeEnabled); 
  22.             } 
  23.         } 
  24.     } 

整個啟動過程涉及3個線程: system_server主線程, “android.display”, “android.ui”;

整個過程是采用阻塞方式(利用Handler.runWithScissors)執行的;

其中WindowManagerService.mH的Looper運行在 “android.display”進程,也就意味著WMS.H.handleMessage()在該線程執行;

WMS 主要用于窗口的添加和移除操作,其對應的方法是 addWindow 和 removeWindow,關于窗口的添加和刪除過程

總結

快年底了,一起加油努力

 

責任編輯:武曉燕 來源: Android開發編程
相關推薦

2016-12-27 19:10:38

Linux命令啟動流程

2021-10-29 16:36:53

AMSAndroidActivityMan

2021-09-18 14:26:49

Linux Linux 啟動流程Linux 系統

2021-10-20 10:04:47

鴻蒙HarmonyOS應用

2022-08-29 17:34:05

鴻蒙操作系統

2010-07-14 17:38:47

MIME協議

2012-07-04 10:31:54

BIOSEFI光盤制作

2021-09-22 08:51:34

Android

2012-12-27 14:37:39

2012-06-18 16:50:34

云計算服務

2021-08-10 20:41:33

AndroidApp流程

2009-09-10 09:53:40

CCNA考試流程CCNA

2023-09-15 07:39:44

分布式數據庫系統高并發

2010-07-08 15:18:06

SSH協議

2009-12-14 13:56:12

Ruby特點

2023-04-26 15:29:35

NAPI模塊鴻蒙

2023-04-28 08:43:46

2024-12-16 08:10:00

Spring開發

2021-04-14 15:23:34

鴻蒙HarmonyOS應用

2011-07-08 14:33:02

Cocos2d iphone
點贊
收藏

51CTO技術棧公眾號

国产精品久久久久久久蜜臀| 亚洲一区自拍| 精品国产制服丝袜高跟| 男女视频网站在线观看| 伦理片一区二区三区| 久久99九九99精品| 国外视频精品毛片| www在线观看免费视频| 成人动漫视频在线观看| 精品欧美aⅴ在线网站 | 在线黄色av网站| 综合在线视频| 亚洲人成电影在线| 精品人妻二区中文字幕| 电影亚洲精品噜噜在线观看| 亚洲视频一区二区在线观看| 久久综合九色欧美狠狠| 91精品中文字幕| 久久国产免费| 九九热精品视频| 日本xxxxxxxxx18| 亚洲电影有码| 午夜欧美视频在线观看| 水蜜桃一区二区三区| 亚洲大尺度网站| 久久久国产精品一区二区中文| 久久精品国产久精国产思思| yy1111111| 97色婷婷成人综合在线观看| 欧美日韩国产色视频| 曰韩不卡视频| 日本一本草久在线中文| 国内精品伊人久久久久av影院 | 午夜影院黄色片| 日本在线一区二区三区| 色天使久久综合网天天| 男人天堂a在线| caoporn国产精品免费视频| 成人一区二区三区视频在线观看| 国产精品成人免费电影| 国产 日韩 欧美 成人| 欧美精品一区二区三区中文字幕| 精品国产一区二区三区四区四| 99视频在线视频| 国产va在线视频| 亚洲免费观看高清在线观看| 青青草久久网络| 蜜臀av在线观看| 激情久久五月天| 国产精品极品在线| 久久免费公开视频| 日韩精品永久网址| 日韩av在线网站| www黄色在线| 中文av在线全新| 亚洲成av人片在www色猫咪| 一区二区三区国| 成人性生交大片免费看午夜| 99久久精品国产毛片| 高清av免费一区中文字幕| 亚洲一区中文字幕在线| 日韩成人一区二区| 国产99久久久欧美黑人| 国产黄色片免费看| 亚洲黄页一区| 国内免费久久久久久久久久久| 久久久久99精品成人片试看| 999久久久精品国产| 正在播放欧美视频| 久久久视频6r| 欧美艳星介绍134位艳星| 国产视频在线一区二区| 97香蕉碰碰人妻国产欧美 | 免费在线黄色片| 国产精品黑丝在线播放 | 成人免费91在线看| 美日韩精品免费| 国产91久久久| 菠萝蜜视频在线观看一区| 91精品国自产在线观看 | 鲁大师成人一区二区三区| 国产69久久精品成人看| 欧美三日本三级少妇99| 99精品国产99久久久久久福利| 久久久久久久网站| 亚洲熟女毛茸茸| 希岛爱理av一区二区三区| 久久精品99久久久香蕉| 小早川怜子一区二区的演员表| 天天天综合网| 欧美肥老妇视频| 久久久久久久99| 久久精品主播| 国产一区视频在线| 国产jzjzjz丝袜老师水多| 国产成人在线视频网址| 国产在线精品一区| 日本福利片高清在线观看| 日本一区二区三区高清不卡| 日本免费在线视频观看| 久久久久黄久久免费漫画| 欧美日韩免费在线| 91香蕉视频导航| 二区三区精品| 日韩国产中文字幕| 日本一区视频在线观看| 婷婷免费在线观看| 亚洲视频自拍| 欧美成人女星排名| 香蕉网在线播放| 欧美激情欧美| 久久久久在线观看| 国产精品久久久久久久久久久久久久久久久 | 一本久久a久久精品亚洲| 能在线观看的av网站| 国产精品亲子伦av一区二区三区| 91精品国产免费| 欲求不满的岳中文字幕| 久久精品国产亚洲夜色av网站| 色在人av网站天堂精品| 日韩欧美成人一区二区三区 | 国产精品美女在线| 性生活视频软件| 国产欧美日产一区| 乱熟女高潮一区二区在线| 久久夜夜操妹子| 日韩三级中文字幕| 亚洲精品视频久久久| 综合国产精品| 国产女同一区二区| 亚洲精品一区二区三区新线路| 国产女同性恋一区二区| 三上悠亚久久精品| 国产成人久久精品一区二区三区| 日韩乱码在线视频| 在线免费观看亚洲视频| 天堂在线亚洲视频| 国产精品视频在线免费观看| 91成人高清| 午夜精品久久久久久久蜜桃app | 国产乱码字幕精品高清av| 日本视频一区二区在线观看| 91九色在线播放| 欧美一级国产精品| 日本黄色激情视频| 三级不卡在线观看| 国产精品二区在线| 亚洲91av| 欧美一区欧美二区| 欧美老女人性生活视频| 久久精品五月| 蜜桃麻豆www久久国产精品| av在线理伦电影| 日韩女优电影在线观看| 日本午夜精品视频| 日韩电影在线观看网站| 六月婷婷久久| 黄色18在线观看| 精品福利一二区| 欧美成人三级在线观看| 精品一区二区三区免费观看| 亚洲国产一区在线| 黄色成人在线视频| 尤物yw午夜国产精品视频明星| 日韩精品手机在线| 99热这里都是精品| 国产一区 在线播放| 国产精品麻豆| 欧美成人性生活| 国产成人精品无码高潮| 亚洲乱码国产乱码精品精98午夜| 国产美女视频免费看| 亚洲成人av| 亚洲a级在线播放观看| 福利在线午夜| 色欧美88888久久久久久影院| www.99热| 久久国产精品露脸对白| 综合久久国产| 日韩欧美中文字幕在线视频 | 天堂av在线资源| 一本一道波多野结衣一区二区 | 精品久久中出| 日本片在线观看| 日韩欧美不卡在线观看视频| 日干夜干天天干| 久久久精品人体av艺术| 91制片厂毛片| 久久精品影视| 国产v亚洲v天堂无码| 国产欧洲在线| 日韩电影中文字幕av| 日本一区二区欧美| 久久久99精品久久| 性生活免费在线观看| 日韩免费特黄一二三区| 国产精品96久久久久久| av影片在线看| 日韩欧美国产wwwww| 日韩精品一区二区三区国语自制| 久久综合成人精品亚洲另类欧美| 最新中文字幕免费视频| 一区二区国产在线| 美女被啪啪一区二区 | 欧美国产日本高清在线| 十八禁一区二区三区| 好吊成人免视频| chinese全程对白| 99热99精品| 奇米视频7777| 国产欧美在线| 免费观看黄色大片| 日本午夜精品| 成人两性免费视频| 天堂在线中文网官网| 日韩一区二区精品视频| 免费看国产片在线观看| 91久久精品国产91性色tv| 91视频青青草| 91麻豆精东视频| 91网址在线观看精品| 亚洲一区网站| 日本中文字幕一级片| 日本午夜精品| 成人有码视频在线播放| 天堂在线中文网官网| 久久夜色精品国产| 少妇性bbb搡bbb爽爽爽欧美| 欧美一区二区日韩| 亚洲色成人www永久网站| 亚洲免费观看高清| 成熟人妻av无码专区| 成人黄色777网| 天美一区二区三区| 日韩二区三区在线观看| 免费看一级大黄情大片| 91tv官网精品成人亚洲| 欧美精彩一区二区三区| 51vv免费精品视频一区二区| 全亚洲最色的网站在线观看| 国产一二三区在线观看| 亚洲欧美在线看| 亚洲 国产 欧美 日韩| 日韩情涩欧美日韩视频| 91精品国产乱码久久久久| 91久久精品网| 69视频免费在线观看| 亚洲五码中文字幕| 免费在线观看黄色小视频| 国产蜜臀av在线一区二区三区| a级一a一级在线观看| 国产高清无密码一区二区三区| 青青草久久伊人| 日韩va欧美va亚洲va久久| 亚洲熟妇av日韩熟妇在线| 欧美日韩亚洲一区| 日本久久高清视频| 五月天激情综合网| 日本免费一区二区三区| 日韩精品诱惑一区?区三区| 日本不卡一区二区三区在线观看| 婷婷综合一区| 久久精品欧美| 欧美尿孔扩张虐视频| 国产一区二区三区黄| 乱亲女h秽乱长久久久| 豆国产97在线| 国产精品男女| 国产女主播一区二区| 136导航精品福利| 国产三区精品| 久久悠悠精品综合网| 国产一区二区三区四区五区加勒比| 久久九九精品视频| 亚洲综合视频1区| 伊人久久影院| 粉嫩av一区二区三区免费观看| 哺乳一区二区三区中文视频 | 久久亚洲国产成人| 最近中文字幕免费mv2018在线 | 国产精品国产亚洲精品看不卡15| 97青娱国产盛宴精品视频| 成人综合色站| 日本国产精品| 欧美lavv| 国产精品精品| 免费人成自慰网站| 亚洲免费中文| 乌克兰美女av| 国产精品一区二区在线观看网站| 精产国品一二三区| 成人国产免费视频| 一级片手机在线观看| 欧美国产一区视频在线观看| 日韩欧美123区| 亚洲成人精品一区| 日韩 国产 欧美| 欧美日韩国产精品自在自线| 国产精品无码天天爽视频| 亚洲精品99久久久久中文字幕| 国产午夜视频在线观看| 久久天天躁狠狠躁夜夜躁| 激情图片在线观看高清国产| 欧洲成人免费视频| 亚洲精品三区| 国产一区二区黄色| 日韩欧美中字| 久久在线中文字幕| 日本不卡在线视频| 在线观看欧美一区二区| 久久夜色精品国产噜噜av| 在线日韩国产网站| 亚洲一区二区三区四区五区黄| 99热国产在线观看| 欧美电影一区二区| 亚洲 精品 综合 精品 自拍| 日韩专区中文字幕| 青青青免费在线视频| 国产一区欧美二区三区| 天海翼亚洲一区二区三区| 中文字幕精品—区二区日日骚| 国产欧美高清| 欧美成人手机在线视频| 久久亚洲综合色一区二区三区 | 亚洲91精品| 免费高清在线观看免费| 国产一区二区伦理| 91精品人妻一区二区三区蜜桃欧美 | 91久久久精品| 红桃成人av在线播放| 日韩黄色片在线| 日本不卡视频在线| 人妻丰满熟妇av无码久久洗澡| 亚洲视频小说图片| 人人妻人人爽人人澡人人精品| 日韩免费视频一区二区| 超碰免费97在线观看| 97成人精品视频在线观看| 精品中文字幕一区二区三区四区 | 伊人久久大香线蕉综合网站| 免费观看亚洲视频| 另类小说欧美激情| 无码少妇精品一区二区免费动态| 亚洲午夜久久久久久久久电影院 | 中文字幕丰满孑伦无码专区| 亚洲色图第一区| 中文字幕一区2区3区| 亚洲男人的天堂在线| 96av在线| 国产富婆一区二区三区| 中文字幕日韩一区二区不卡 | 久久免费手机视频| 色婷婷亚洲精品| 亚洲色图欧美视频| 韩国三级电影久久久久久| 日韩一区免费| 最新av网址在线观看| 国产在线播精品第三| 久久嫩草捆绑紧缚| 欧美理论片在线| 欧洲不卡av| 国产欧美日韩最新| 青草国产精品| 视频二区在线播放| 久久久久久久久免费| 亚洲天堂视频在线播放| 中文字幕亚洲欧美在线| 电影在线观看一区二区| 天天久久人人| 蜜臀国产一区二区三区在线播放| 成人黄色a级片| 欧美电影在线免费观看| www在线免费观看视频| 99国产精品久久久久老师| 欧美日本一区二区视频在线观看| 人妻体体内射精一区二区| 亚洲一区影音先锋| 午夜18视频在线观看| 日本精品久久久久影院| 国产麻豆精品久久| 亚洲欧洲日本精品| 亚洲品质自拍视频| 欧美 日韩 国产 成人 在线 91| 97视频在线观看视频免费视频| 神马香蕉久久| 九一精品在线观看| 中文字幕视频一区二区三区久| va视频在线观看| 97精品国产97久久久久久免费| 红杏视频成人| av网站在线观看不卡| 成人欧美一区二区三区在线播放| 国内老熟妇对白hdxxxx| 97婷婷涩涩精品一区| 日本中文字幕在线一区| www.色就是色| 亚洲免费观看高清完整版在线观看 | 九色在线视频| 91在线视频精品| 亚洲精品乱码|