美文网首页
【Android面试题】高级UI面试题——Activity,Wi

【Android面试题】高级UI面试题——Activity,Wi

作者: 小城哇哇 | 来源:发表于2023-08-28 20:01 被阅读0次

Activity,Window,View三者的联系和区别

这道题想考察什么?

  1. 是否了解Activity,Window,View的原理?

考察的知识点

  1. Window和View的关系
  2. Activity与Window的关系

考生应该如何回答

  1. Activity,Window,View分别是什么?
  • Activity是安卓四大组件之一,负责界面、交互和业务逻辑处理;

  • Window对安卓而言,是窗体的一种抽象,是顶级Window的外观与行为策略。目前仅有的实现类是PhoneWindow;

  • View是放在Window容器的元素,Window是View的载体,View是Window的具体展示;

    通过上面名词的解释以及平时开发中的实际,大家可以发现window其实没有什么实质性的意义,因为平时开发中,我们往往是在activity里面直接处理View。那么为什么还需要window呢?主要是从面向对象的角度来设计代码的结构的,类的职责应该单一,那么activity view都有它们自己的职责,所以activity管理view就需要有它独立类来进行这就是通过window进行。

  1. 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);
}
  1. 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。

最后

有需要以上面试题的朋友可以关注一下哇哇,以上都可以分享!!!

相关文章

  • Android面试题

    Android面试必备: (一)、Java面试题 (二)、Android面试题 (三)、Android高级面试题

  • l 主要分为以下几部分: (1)java 面试题 (2)Android 面试题 (3)高级开发技术面试题 (...

  • Android面试题——View篇

    Android面试题View篇 Activity生命周期? onCreate() -> onStart() -> ...

  • Android面试题与解析

    主要分为以下几部分: (1)java面试题 (2)Android面试题 (3)高级开发技术面试题 (4)跨平台Hy...

  • 2019-10-17

    主要分为以下几部分:(1)java面试题 (2)Android面试题 (3)高级开发技术面试题 (4)跨平台Hyb...

  • Android面试题整理(一)

    Android面试题整理(一) 1.Activity和Fragment的生命周期有哪些? (1)Activity的...

  • 面试题

    关注的面试题文集 Android面试题整理 Android工程师面试题大全 Android 面试题总结之Andro...

  • Android最全面试大纲(一)

    文章目录: Activity面试题 Fragment面试题 Service面试题 Broadcast Receiv...

  • Android超实用最全面试大纲(一)

    文章目录: Activity面试题 Fragment面试题 Service面试题 Broadcast Receiv...

  • ios面试题

    初级面试题 中级面试题 高级面试题 swift篇

网友评论

      本文标题:【Android面试题】高级UI面试题——Activity,Wi

      本文链接:https://www.haomeiwen.com/subject/hzagmdtx.html