R.layout.keyguard_host_view的创建流程以及KeyguardTransportControlView

注意:这些代码运行在什么环境下? SystemServer进程所属的Thread

-->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);
}

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

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

mPolicy.init(mContext, WindowManagerService.this, WindowManagerService.this);
mAnimator.mAboveUniverseLayer = mPolicy.getAboveUniverseLayer()
* TYPE_LAYER_MULTIPLIER
+ TYPE_LAYER_OFFSET;
}
}, 0);
}
注意:这里mPolicy.init()已经在uiHandler里做了,所以后面涉及的inflate等UI操作都是安全的


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

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

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

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

到这里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 有关。

更多相关文章

  1. 基于ARouter的组件化开发
  2. Android(安卓)AlertDialog对话框详解及实例
  3. Android(安卓)App增量更新详解及实例代码
  4. Android(java)学习笔记125:Clock app编写报错02
  5. Android培训班(13)
  6. [置顶] Android(安卓)IPC 通讯机制源码分析【中】
  7. Android——公共XML资源的使用
  8. android使用service和activity获取屏幕尺寸的方法
  9. sharedPreferences的相关用法介绍

随机推荐

  1. Android(安卓)Network Resources
  2. 关于RelativeLayout的一点经验
  3. ScrollView滚动条的各种设置
  4. android界面布局
  5. ImageView的属性android:scaleType
  6. Android(安卓)ListView动态刷新
  7. 系出名门Android(9) - 数据库支持(SQLite
  8. android 结构分析
  9. Android预定义样式
  10. ADT在线安装与更新