设为首页 加入收藏

TOP

Android4.0 WindowManagerService的分析(四)
2014-11-24 11:47:46 来源: 作者: 【 】 浏览:2
Tags:Android4.0 WindowManagerService 分析
index--;


//这里就完成了添加View到WindowManager


mViews[index] = view;


mRoots[index] = root;


mParams[index] = wparams;


}


//这一步非常重要


root.setView(view, wparams, panelParentView);


}



ViewRootImpl.java


public ViewRootImpl(Context context) {


getWindowSession(context.getMainLooper());



//获取当前activity的线程


mThread = Thread.currentThread();


//IWindow的代理,在ViewRootImpl中创建


//这里强调一下,创建W时传入this,代指ViewRootImpl的ContextImpl,而这个ContextImpl又是由


//WindowManagerImpl传入的ContextImpl,再之后就是当前的调用者的ContextImpl传递给//ContextImpl.java的获取Service时传入的。这样看来,在当前的上下文创建了一个实例,只要传入它的//Context,那么,都是可以通过Context找到这个当前调用者的


mWindow = new W(this);


}



public static IWindowSession getWindowSession(Looper mainLooper) {


synchronized (mStaticInit) {


if (!mInitialized) {


try {


//先获取InputMethodManager,然后用它调用InputMethodManagerService


InputMethodManager imm = InputMethodManager.getInstance(mainLooper);



//获取WindowManagerService中的Session,同时我们看到这里用到了


//InputMethodManagerService的mClient和ControlledInputConnectionWrapper


sWindowSession = Display.getWindowManager().openSession(


imm.getClient(), imm.getInputContext());



mInitialized = true;


} catch (RemoteException e) {


}


}


//注意:sWindowSession是个全局变量


return sWindowSession;


}


}



WindowManagerService.java


这个sWindowSession是在WindowManagerService中实现的,是client调用WindowManagerService的接口。


每一个ViewRoot对应在WindowManagerService中有一个sWindowSession


同时我们注意,这里传入的client是InputMethodManager中的IInputMethodClient类型的mClient


public IWindowSession openSession(IInputMethodClient client,


IInputContext inputContext) {


……


//创建一个Session并返回


//在这个Session的构造函数中有如下操作:


//mService.mInputMethodManager.addClient(client, inputContext, mUid, mPid);


//将InputMethodManger中的mClient添加进去了


Session session = new Session(this, client, inputContext);



return session;


}


我们接着,WindowManagerImpl往下看,在setView的最后会调用ViewRoot.setView(),这个是连接client和


WindowManagerService的关键地方:


public void setView(View view, WindowManager.LayoutParams attrs, View panelParentView) {


……


try {


mOrigWindowType = mWindowAttributes.type;


//这里调用


res = sWindowSession.add(mWindow, mSeq, mWindowAttributes,


getHostVisibility(), mAttachInfo.mContentInsets, mInputChannel);


} catch (RemoteException e) {


……


}



}



Session.java


public int add(IWindow window, int seq, WindowManager.LayoutParams attrs,


int viewVisibility, Rect outContentInsets, InputChannel outInputChannel) {


//如此,将Client端提供给WindowManagerService的接口IWindow赋给WindowManagerService使用


return mService.addWindow(this, window, seq, attrs, viewVisibility, outContentInsets,


outInputChannel);


}



WindowManagerService.java


//主要是将PhoneWindow的回调函数IWindow传递给WindowManagerService


//outInputChannel是inputChannel


public int addWindow(Session session, IWindow client, int seq,


WindowManager.LayoutParams attrs, int viewVisibility,


Rect outContentInsets, InputChannel outInputChannel) {


WindowState win = null;



win = new WindowState(this, session, client, token,


attachedWindow, seq, attrs, viewVisibility);



……


win.attach();



if (o

首页 上一页 1 2 3 4 下一页 尾页 4/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Android4.0 Power、home、menu等.. 下一篇Cygwin配合NDK开发Android程序

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·“我用Java 8”已成 (2025-12-26 11:19:54)
·下载 IntelliJ IDEA (2025-12-26 11:19:52)
·Java是什么?(通俗 (2025-12-26 11:19:49)
·雾里看花:真正意义 (2025-12-26 10:54:36)
·C++——模板(超详细 (2025-12-26 10:54:34)