【Android面试题】高级UI面试题——Activity,Wi
2023-08-28 本文已影响0人
小城哇哇
Activity,Window,View三者的联系和区别
这道题想考察什么?
- 是否了解Activity,Window,View的原理?
考察的知识点
- Window和View的关系
- Activity与Window的关系
考生应该如何回答
- Activity,Window,View分别是什么?
-
Activity是安卓四大组件之一,负责界面、交互和业务逻辑处理;
-
Window对安卓而言,是窗体的一种抽象,是顶级Window的外观与行为策略。目前仅有的实现类是PhoneWindow;
-
View是放在Window容器的元素,Window是View的载体,View是Window的具体展示;
通过上面名词的解释以及平时开发中的实际,大家可以发现window其实没有什么实质性的意义,因为平时开发中,我们往往是在activity里面直接处理View。那么为什么还需要window呢?主要是从面向对象的角度来设计代码的结构的,类的职责应该单一,那么activity view都有它们自己的职责,所以activity管理view就需要有它独立类来进行这就是通过window进行。
- Window和View的关系。
- Window是一个界面的窗口,适用于存放View的容器,即Window是View的管理者。安卓中所有的视图都是通过Window来呈现的,比如Activity、Dialog、Toast;
- Window的添加、删除和更改是通过WindowManager来实现的,而WindowManager又是继承ViewManager。
- WindowManager也是一个接口,它的唯一实现类是WindowManagerImpl,所以往往在管理view的时候,系统是通过WindowManagerImpl来管理view。
- WindowManagerImpl内部的实现极其简单,它会将所有的方法全部转交给WindowManagerGlobal中的方法来进行。
- windowManagerGlobal 通过调用 ViewRootImpl 来完成对view的操作。
- ViewRootImpl 是视图层次结构的顶部,它实现了View与WindowManager之间所需要的协议,并且大部分的WindowManagerGlobal的内部实现是通过ViewRootImpl来进行的。
public interface ViewManager
{
public void addView(View view, ViewGroup.LayoutParams params);
public void updateViewLayout(View view, ViewGroup.LayoutParams params);
public void removeView(View view);
}
- Activity与Window的关系。
- Activity是向用户展示一个界面,并可以与用户进行交互。我们通过分析原理发现Activity内部持有一个Window对象,用户管理View。
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, String referrer, IVoiceInteractor voiceInteractor,
Window window, ActivityConfigCallback activityConfigCallback, IBinder assistToken) {
attachBaseContext(context);
mFragments.attachHost(null /*parent*/);
mWindow = new PhoneWindow(this, window, activityConfigCallback);
mWindow.setWindowControllerCallback(mWindowControllerCallback);
mWindow.setCallback(this);
mWindow.setOnWindowDismissedCallback(this);
mWindow.getLayoutInflater().setPrivateFactory(this);
}
- 从Activity的attch函数中是可以发现,新建了一个PhoneWindow对象并赋值给了mWindow。Window相当于Activity的管家,用于管理View的相关事宜。事件的分发,其实也是先交予Window再向下分发。
public boolean dispatchTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
onUserInteraction();
}
if (getWindow().superDispatchTouchEvent(ev)) {
return true;
}
return onTouchEvent(ev);
}
- 从上面的代码中可以发现,事件被传递到了Window的superDispatchTouchEvent方法,再接着会传递给我们的DecorView。
最后
有需要以上面试题的朋友可以关注一下哇哇,以上都可以分享!!!