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