Android远程服务创建步骤,Android 4.2.2 ScreenLock上Music远程播放控制界面的创建流程...

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值