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 有關。