Android并发编程高级面试题汇总最全最细面试题讲解持续更新中👊👊
👀你想要的面试题这里都有👀
👇👇👇
View的绘制流程是从Activity的哪个生命周期方法开始执行的
这道题想考察什么?
考察同学对Activity的生命周期和View的绘制流程是否熟悉
考生应该如何回答
View的绘制流程是从Activity的 onResume 方法开始执行的。
首先我们找到 onResume 在哪儿执行的,代码如下:
// ActivityThread.java
public void handleResumeActivity(IBinder token, boolean finalStateRequest, boolean isForward, String reason) {
// 1 执行 onResume 流程
final ActivityClientRecord r = performResumeActivity(token, finalStateRequest, reason);
// 2 执行 View 的流程
wm.addView(decor, l);
}
由上面1代码进入,我们继续跟进:
public ActivityClientRecord performResumeActivity(IBinder token, boolean finalStateRequest,
String reason) {
r.activity.performResume(r.startsNotResumed, reason);
}
// Activity.java
final void performResume(boolean followedByPause, String reason) {
mInstrumentation.callActivityOnResume(this);
}
public void callActivityOnResume(Activity activity) {
activity.onResume();
}
到这儿我们就找到了onResume方法的执行位置。而View的绘制就是由2代码进入:wm.addView 中的wm 就是 WindowManager,但是WindowManger是一个接口,实际调用的是 WindowManagerImpl 的 addView 方法
// WindowManagerImpl.java
public void addView(@NonNull View view, @NonNull ViewGroup.LayoutParams params) {
mGlobal.addView(view, params, mContext.getDisplayNoVerify(), mParentWindow,
mContext.getUserId());
}
mGlobal 是 WindowManagerGlobal 对象
// WindowManagerGlobal.java
public void addView(View view, ViewGroup.LayoutParams params,
Display display, Window parentWindow, int userId) {
root = new ViewRootImpl(view.getContext(), display);
root.setView(view, wparams, panelParentView, userId);
}
public void setView(View view, WindowManager.LayoutParams attrs, View panelParentView,
int userId) {
requestLayout();
}
到这儿我们可以看到,通过 requestLayout 开始绘制 View。
所以通过以上分析可以知道,在调用了 onResume 生命周期方法后,开始执行 View 的绘制。更多细节,请各位去查看7.6题相关的说明。
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。
由于面试题内容比较多,篇幅有限,资料已经被整理成了PDF文档,有需要2023年Android中高级最全面试真题答案 完整文档的可扫描下方卡片免费获取~

PS:(文末还有使用ChatGPT机器人小福利哦!!大家不要错过)
目录

第一章 Java方面
- Java基础部分
- Java集合
- Java多线程
- Java虚拟机

第二章 Android方面
- Android四大组件相关
- Android异步任务和消息机制
- Android UI绘制相关
- Android性能调优相关
- Android中的IPC
- Android系统SDK相关
- 第三方框架分析
- 综合技术
- 数据结构方面
- 设计模式
- 计算机网络方面
- Kotlin方面

第三章 音视频开发高频面试题
- 为什么巨大的原始视频可以编码成很小的视频呢?这其中的技术是什么呢?
- 怎么做到直播秒开优化?
- 直方图在图像处理里面最重要的作用是什么?
- 数字图像滤波有哪些方法?
- 图像可以提取的特征有哪些?
- 衡量图像重建好坏的标准有哪些?怎样计算?

第四章 Flutter高频面试题
- Dart部分
- Flutter部分

第五章 算法高频面试题
- 如何高效寻找素数
- 如何运用二分查找算法
- 如何高效解决雨水问题
- 如何去除有序数组的重复元素
- 如何高效进行模幂运算
- 如何寻找最长回文子串

第六章 Andrio Framework方面
- 系统启动流程面试题解析
- Binder面试题解析
- Handler面试题解析
- AMS面试题解析

文章详细解析了Android面试中的高级题目,涉及View的绘制流程,从Activity的onResume开始,经过WindowManager和ViewRootImpl,展示了Activity、Window和View之间的关系。同时讨论了并发编程在Android中的应用和面试要点。
534

被折叠的 条评论
为什么被折叠?



