很多刚搞 ANDROID 开发的童鞋 都认为ANDROID 的界面是直接绑定在了ACTIVITY上,但事实并不是这样子的。今天我们就来讨论一下ACTIVITY 内部原理
当我们第一次启动ACTIVITY的时候,构造方法会首先调用ACTIVITY类中的ATTACH方法 如下
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,
Object lastNonConfigurationInstance,
HashMap<String,Object> lastNonConfigurationChildInstances,
Configuration config) {
attachBaseContext(context);
mWindow = PolicyManager.makeNewWindow(this);
mWindow.setCallback(this);
if (info.softInputMode != WindowManager.LayoutParams.SOFT_INPUT_STATE_UNSPECIFIED) {
mWindow.setSoftInputMode(info.softInputMode);
}
mUiThread = Thread.currentThread();
mMainThread = aThread;
mInstrumentation = instr;
mToken = token;
mIdent = ident;
mApplication = application;
mIntent = intent;
mComponent = intent.getComponent();
mActivityInfo = info;
mTitle = title;
mParent = parent;
mEmbeddedID = id;
mLastNonConfigurationInstance = lastNonConfigurationInstance;
mLastNonConfigurationChildInstances = lastNonConfigurationChildInstances;
mWindow.setWindowManager(null, mToken, mComponent.flattenToString());
if (mParent != null) {
mWindow.setContainer(mParent.getWindow());
}
mWindowManager = mWindow.getWindowManager();
mCurrentConfig = config;
}
通过 这段代码我们可以看到,再启动ACTIVITY的时候他会给我们生成一个mWindow对象 他是Window对象的一个子类
是由phonewindow实现的 。源码中通过 PolicyManager.makeNewWindow(this);
来获取此对象 实际上他是调用的Policy.makeNewWindow(this)对象生成的PhoneWindow.
看到这可能有童鞋有疑问,想说到底什么事PHONEWINDOW呢???
要想明白PHONEWINDOW 首先要明白他的父类WINDOW类 它本身是一个抽象类
Android的窗口管理是C/S模式的。Android中的Window是表示Top Level等顶级窗口的概念。DecorView是Window的Top-Level View,这个View我称之为主View,DecorView会缺省的attach到Activity的主窗口中。主View被加入到WindowManager中,WM使用WindowState与这个主View对应。
现在我们明白了WINDOW以后 我们就应该有一个概念 , 其实ACTIVITY相当于一个控制层,它是用来生成WINDOW 而WINDOW则是加载我们的界面。