Android 4.2.2 ScreenLock上Music遠程播放控制界面的建立流程

R.layout.keyguard_host_view的建立流程以及KeyguardTransportControlView
 
  注意:這些代碼運行在什麼環境下?  SystemServer進程所屬的Thread java

-->SystemServer.java
 public void run() {
            Slog.i(TAG, "Window Manager");
            wm = WindowManagerService.main(context, power, display, inputManager,
                    uiHandler, wmHandler,
                    factoryTest != SystemServer.FACTORY_TEST_LOW_LEVEL,
                    !firstBoot, onlyCore);
  }
  
   在SystemServer初始化時,會爲WindowManagerService專門建立一個獨立的HandlerThread。
   調WindowManagerService.main()時,轉而在這個HandlerThread中建立WindowManagerService 自己
   另外,SystemServer有專門建立一個內部UI顯示用的uiHandlerThread,用於WindowManagerPolicy,
   KeyguardViewManager,DisplayManagerService 安全


-->WindowManagerService.java
   WindowManagerService(){
    initPolicy(uiHandler);
   } ide

   注意是mPolicy.init()方法, mPolicy 是誰?是PhoneWindowManager !
   final WindowManagerPolicy mPolicy = PolicyManager.makeNewWindowManager(); oop

    private void initPolicy(Handler uiHandler) {
        uiHandler.runWithScissors(new Runnable() {
            @Override
            public void run() {
                WindowManagerPolicyThread.set(Thread.currentThread(), Looper.myLooper()); ui

                mPolicy.init(mContext, WindowManagerService.this, WindowManagerService.this);
                mAnimator.mAboveUniverseLayer = mPolicy.getAboveUniverseLayer()
                        * TYPE_LAYER_MULTIPLIER
                        + TYPE_LAYER_OFFSET;
            }
        }, 0);
    }
   注意:這裏mPolicy.init()已經在uiHandler裏作了,因此後面涉及的inflate等UI操做都是安全的 this

  


-->PolicyManager.java
    public static WindowManagerPolicy makeNewWindowManager() {
        return sPolicy.makeNewWindowManager();
    }
    sPolicy就是Policy.java的實例 進程

-->Policy.java
    public WindowManagerPolicy makeNewWindowManager() {
        return new PhoneWindowManager();
    } ci

-->PhoneWindowManager.java
   init(){
   mKeyguardMediator = new KeyguardViewMediator(context, null);
   } rem

-->KeyguardViewMediator.java
   KeyguardViewMediator(){
        mKeyguardViewManager = new KeyguardViewManager(context, wm, mViewMediatorCallback,
                mLockPatternUtils);
   } get

   到這裏KeyguardViewManager已經創立,能夠根據KeyguardViewMediator的要求來顯示Keyguard lock與否

   handleShow(){
    mKeyguardViewManager.show(options);
   }

-->KeyguardViewManager.java

   show()
   -->maybeCreateKeyguardLocked()
     -->inflateKeyguardView()
         View view = inflater.inflate(R.layout.keyguard_host_view, mKeyguardHost, true);
         直接把keyguard_host_view加到mKeyguardHost(ViewManagerHost--FrameLayout)裏,也就是加到了View系統裏
         問題:在哪一個Thread裏作的?跟SystemServer建立的那個uiHandlerThread是一致的嗎?

-->KeyguardHostView.java
   具體負責顯示, 特別是跟Music播放有關的Remote Control View--KeyguardTransportControlView 也在這裏處理

    private void initializeTransportControl() {
        mTransportControl =
            (KeyguardTransportControlView) findViewById(R.id.keyguard_transport_control);
        mTransportControl.setVisibility(View.GONE);

    showAppropriateWidgetPage()   -->顯示RemoteControlView


-->KeyguardTransportControlView.java
   onAttachedToWindow()   -->mAudioManager.registerRemoteControlDisplay(mIRCD);
   onDetachedFromWindow()  -->mAudioManager.unregisterRemoteControlDisplay(mIRCD);

-->AudioService.java private IRemoteControlDisplay mRcDisplay;  與Keyguard上顯示的remote control view 有關。

相關文章
相關標籤/搜索