在这篇文章中,我们将为您详细介绍Android应用程序窗口(Activity)窗口对象(Window)创建指南的内容,并且讨论关于android窗口创建的流程的相关问题。此外,我们还会涉及一些关于An
在这篇文章中,我们将为您详细介绍Android应用程序窗口(Activity)窗口对象(Window)创建指南的内容,并且讨论关于android 窗口创建的流程的相关问题。此外,我们还会涉及一些关于Android 1.6:“android.view.WindowManager$BadTokenException:无法添加窗口——令牌 null 不适用于应用程序”、android PopupWindow 和 Activity弹出窗口实现方式、android popupwindow跳转activity、Android styles.xml windowNoTitle(ActionBarActivity)的知识,以帮助您更全面地了解这个主题。
本文目录一览:- Android应用程序窗口(Activity)窗口对象(Window)创建指南(android 窗口创建的流程)
- Android 1.6:“android.view.WindowManager$BadTokenException:无法添加窗口——令牌 null 不适用于应用程序”
- android PopupWindow 和 Activity弹出窗口实现方式
- android popupwindow跳转activity
- Android styles.xml windowNoTitle(ActionBarActivity)
Android应用程序窗口(Activity)窗口对象(Window)创建指南(android 窗口创建的流程)
在前文中,我们分析了Android应用程序窗口的运行上下文环境的创建过程。由此可知,每一个Activity组件都有一个关联的ContextImpl对象,同时,它还关联有一个Window对象,用来描述一个具体的应用程序窗口。由此又可知,Activity只不过是一个高度抽象的UI组件,它的具体UI实现其实是由其它的一系列对象来实现的。在本文中,我们就将详细分析Android应用程序窗口对象的创建过程。
从前面Android应用程序窗口(Activity)实现框架简要介绍和学习计划一文可以知道,在PHONE平台上,与Activity组件所关联的窗口对象的实际类型为PhoneWindow,后者是从Window类继承下来的。Activity、Window和PhonwWindow三个类的关系可以参考Android应用程序窗口(Activity)实现框架简要介绍和学习计划一文中的图3和图5。为了方便接下来描述类型为PhoneWindow的应用程序窗口的创建过程,我们将这两个图拿过来,如以下的图1和图2所示:
图1 Activity和Window的类关系图
图2 Window和PhoneWindow的类关系图
上述两个图中所涉及到的类的描述可以参考Android应用程序窗口(Activity)实现框架简要介绍和学习计划一文,本文主要从Android应用程序窗口的创建过程来理解Activity、Window和PhonwWindow三个类的关系。
从Android应用程序窗口(Activity)的运行上下文环境(Context)的创建过程分析一文又可以知道,与Activity组件所关联的一个PhoneWindow对象是从Activity类的成员函数attach中创建的,如图3所示:
图3 Android应用程序窗口的创建过程
这个过程可以分为9个步骤,接下来我们就详细分析每一个步骤。
Step 1. Activity.attach
public class Activity extends ContextThemeWrapper
implements LayoutInflater.Factory,
Window.Callback,KeyEvent.Callback,
OnCreateContextMenuListener,ComponentCallbacks {
......
private Window mWindow;
......
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) {
......
mWindow = PolicyManager.makeNewWindow(this);
mWindow.setCallback(this);
if (info.softInputMode != WindowManager.LayoutParams.soFT_INPUT_STATE_UNSPECIFIED) {
mWindow.setSoftInputMode(info.softInputMode);
}
......
mWindow.setwindowManager(null,mToken,mComponent.flattenToString());
......
}
......
}
这个函数定义在文件frameworks/base/core/java/android/app/Activity.java中。
在前面Android应用程序窗口(Activity)的运行上下文环境(Context)的创建过程分析一文中,我们已经分析过这个函数的实现了,这里我们只关注与应用程序窗口创建相关的代码。
函数首先调用PolicyManager类的静态成员函数makeNewWindow来创建一个类型为PhoneWindow的应用程序窗口,并且保存在Activity类的成员变量mWindow中。有了这个类型为PhoneWindow的应用程序窗口,函数接下来还会调用它的成员函数setCallback、setSoftInputMode和setwindowManager来设置窗口回调接口、软键盘输入区域的显示模式和本地窗口管理器。
PhoneWindow类的成员函数setCallback、setSoftInputMode和setwindowManager都是从父类Window继承下来的,因此,接下来我们就继续分析PolicyManager类的静态成员函数makeNewWindow,以及Window类的成员函数setCallback、setSoftInputMode和setwindowManager的实现。
Step 2. PolicyManager.makeNewWindow
public final class PolicyManager {
private static final String POLICY_IMPL_CLASS_NAME =
"com.android.internal.policy.impl.Policy";
private static final IPolicy sPolicy;
static {
// Pull in the actual implementation of the policy at run-time
try {
Class policyClass = Class.forName(POLICY_IMPL_CLASS_NAME);
sPolicy = (IPolicy)policyClass.newInstance();
} catch (ClassNotFoundException ex) {
throw new RuntimeException(
POLICY_IMPL_CLASS_NAME + " Could not be loaded",ex);
} catch (InstantiationException ex) {
throw new RuntimeException(
POLICY_IMPL_CLASS_NAME + " Could not be instantiated",ex);
} catch (illegalaccessexception ex) {
throw new RuntimeException(
POLICY_IMPL_CLASS_NAME + " Could not be instantiated",ex);
}
}
......
// The static methods to spawn new policy-specific objects
public static Window makeNewWindow(Context context) {
return sPolicy.makeNewWindow(context);
}
......
}