设为首页 加入收藏

TOP

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

对于Activity,在ActivityThread.java在handleLaunchActivity会调用performLaunchActivity,而performLaunchActivity则调用Activity中的attach函数,实现创建window(实际是PhoneWindow):


Activity.java


final void attach(Context context, ActivityThread aThread,


Instrumentation instr, IBinder token, int ident,


Application application, Intent intent, ActivityInfo info,


CharSequence title, Activity parent, String id,


NonConfigurationInstances lastNonConfigurationInstances,


Configuration config) {



//创建window


mWindow = PolicyManager.makeNewWindow(this);


mWindow.setCallback(this);


mWindow.getLayoutInflater().setPrivateFactory(this);


if (info.softInputMode != WindowManager.LayoutParams.SOFT_INPUT_STATE_UNSPECIFIED) {


mWindow.setSoftInputMode(info.softInputMode);


}


if (info.uiOptions != 0) {


mWindow.setUiOptions(info.uiOptions);


}



//获取WindowManager


mWindow.setWindowManager(null, mToken, mComponent.flattenToString(),


(info.flags & ActivityInfo.FLAG_HARDWARE_ACCELERATED) != 0);


mWindowManager = mWindow.getWindowManager();


}



PolicyManager.java


public static Window makeNewWindow(Context context) {


//使用sPolicy来创建window


return sPolicy.makeNewWindow(context);


}


这里的sPolicy定义是:private static final IPolicy sPolicy;


那么,如何初始化?


private static final String POLICY_IMPL_CLASS_NAME =


static {


// 获取Policy这个class并实例化


try {


Class policyClass = Class.forName(POLICY_IMPL_CLASS_NAME);


sPolicy = (IPolicy)policyClass.newInstance();


}


}



再往下:


Policy.java


public class Policy implements IPolicy {


public Window makeNewWindow(Context context) {


/*可见,activity.attach中的PolicyManager.makeNewWindow(this)是新建一个PhoneWindow


*context则是Activity中实现的ContextImpl实例


*而PhoneWindow是window的子类,故而可以赋给window


*/


return new PhoneWindow(context);


}


……


}


由Policy的定义可知,Policy implement IPolicy,并且实现了它定义的接口。


/*至此,实现了创建一个PhoneWindow*/



接着Activity.attach往下:


//设置window的Callback,Activity是实现了Window.Callback的接口的


mWindow.setCallback(this);


mWindow.getLayoutInflater().setPrivateFactory(this);


//设置soft input mode


if (info.softInputMode != WindowManager.LayoutParams.SOFT_INPUT_STATE_UNSPECIFIED) {


mWindow.setSoftInputMode(info.softInputMode);


}


if (info.uiOptions != 0) {


mWindow.setUiOptions(info.uiOptions);


}



我们回到最初,我们说过,在ActivityThread中会在performLaunchActivity之后判断是否成功,并真正调用handleResumeActivity();



ActivityThread.java


final void handleResumeActivity(IBinder token, boolean clearHide, boolean isForward) {


ActivityClientRecord r = performResumeActivity(token, clearHide);


//这个layoutParams是在ActivityClientRecord 这里的。


WindowManager.LayoutParams l = r.window.getAttributes();


……


/*


*r是ActivityClientRecord,在performResumeActivity之前并没有将window加入到r中


*那么,activity如何创建并且是如何加入到这个activityClientRecord中的呢?


*/


if (r.window == null && !a.mFinished && willBeVisible) {


//在activity的attach函数中创建的activity的window赋给r.window


r.window = r.activity.getWindow();



//我们知道attach创建的是PhoneWindow,那PhoneWindow中DecorView如何创建的?


View decor = r.window.getDecorView();


decor.setVisibility(View.INVISIBLE);



//WindowManager是ViewManager的子类


ViewManager wm = a.getWindowManager();


WindowManager.LayoutPar

首页 上一页 1 2 3 4 下一页 尾页 1/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)