Activity加载显示,关联AMS WMS

本文详细解析了Android中Activity从创建到显示的过程,包括通过ActivityThread的main方法启动UI主线程,Activity的实例化过程,以及如何加载布局并最终将Activity显示在界面上。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ActivityThread.java

public static void main(String[]args) {

//main函数进行消息的轮询。通过zygote进程,创建应用进程,执行main方法,这也是我们平时所说的UI主进程

  Looper.prepareMainLooper();

  ActivityThread thread = newActivityThread();

  thread.attach(false);

  Looper.loop();

}

private void attach(booleansystem) {

    final IActivityManager mgr =ActivityManagerNative.getDefault();//AMS关联

    try{

       mgr.attachApplication(mAppThread);

     } catch (RemoteException ex) {

    }

}

handleMessage

   case LAUNCH_ACTIVITY:

   case RESUME_ACTIVITY:

         handleLaunchActivity

              Activity a = performLaunchActivity(r,customIntent);

              Activityactivity = null;

               try{

                    java.lang.ClassLoader cl = r.packageInfo.getClassLoader();

                    //通过反射机制加载Activity 

                    activity = mInstrumentation.newActivity(cl, component.getClassName(), r.intent);

              }catch (Exception e) {}

           Application app = r.packageInfo.makeApplication(false, mInstrumentation);

           if (activity != null) {

                Context appContext = createBaseContextForActivity(r, activity);

                activity.attach(appContext, this, getInstrumentation(),r.token,

                        r.ident, app, r.intent,r.activityInfo, title, r.parent,

                        r.embeddedID,r.lastNonConfigurationInstances, config,

                        r.referrer,r.voiceInteractor);

           }

            handleResumeActivity

             View decor = r.window.getDecorView();

             ViewManager wm = a.getWindowManager();

             wm.addView(decor,l);

Activity.java

public void setContentView(int layoutResID) {

       //getWindow()得到一个Window对象 mWindowWindow是一个抽象类。

       Window是一个抽象类,mWindow对象的实现类就是PhoneWindow

       getWindow().setContentView(layoutResID);

       initWindowDecorActionBar();

    }

   public Window getWindow() {

       return mWindow;

    }

   final void attach(Context context,ActivityThread aThread,

              ……….

             Configuration config, Stringreferrer, IVoiceInteractor voiceInteractor) {

              mWindow= PolicyManager.makeNewWindow(this);

 

              mWindow.setWindowManager(//关联WindowManager

                (WindowManager)context.getSystemService(Context.WINDOW_SERVICE),

                mToken,mComponent.flattenToString(),

                (info.flags &ActivityInfo.FLAG_HARDWARE_ACCELERATED) != 0);

 

              mWindowManager =mWindow.getWindowManager();

            }

Policy.java

public Window makeNewWindow(Contextcontext) {

   return new PhoneWindow(context);

}

PhoneWindow.java

public void setContentView(intlayoutResID) {

  if (mContentParent == null) {

        installDecor();

     }

mContentParent.addView(view,params);

 }

private final class DecorView extends FrameLayoutimplements RootViewSurfaceTaker {

}

Window.java

 public void setWindowManager(WindowManagerwm, IBinder appToken, String appName, boolean hardwareAccelerated) {

     mWindowManager= ((WindowManagerImpl)wm).createLocalWindowManager(this);  

 }

WindowManagerImpl.java

private final WindowManagerGlobalmGlobal = WindowManagerGlobal.getInstance();

WindowManagerGlobal.java

public void addView(Viewview, ViewGroup.LayoutParams params, Display display, Window parentWindow) {

       ViewRootImpl root;

       root = new ViewRootImpl(view.getContext(),display);

}

ViewRootImpl.java

public void setView(Viewview, WindowManager.LayoutParams attrs, View panelParentView) {

requestLayout();

      scheduleTraversals();

       mHandler.post(mTraversalRunnable);

           doTraversal();

              performTraversals();

                // Android系统View的绘制流程:依次执行View类里面的如下三个方法      

                  measure(int ,int) :测量View的大小

                  layout(int ,int ,int ,int) :设置子View的位置

                 draw(Canvas) :绘制View内容到Canvas画布上

                 performMeasure(childWidthMeasureSpec,childHeightMeasureSpec);

                 performLayout(lp,desiredWindowWidth, desiredWindowHeight);

                 performDraw();

                   draw(fullRedrawNeeded);

 

                view.assignParent(this);

}

 

public ViewParent invalidateChildInParent(int[]location, Rect dirty) {

}

 


<think>好的,用户现在问的是安卓系统开发工程师面试时会问到哪些问题。我需要先回顾之前的对话历史,用户之前询问过Content Provider,现在转向面试问题。这可能意味着用户正在准备面试,或者想了解安卓开发的职业要求。 首先,用户可能希望了解常见的面试问题,包括基础知识、框架组件、性能优化、架构设计等。需要分门别类,结构清晰,便于用户理解和准备。 接下来,要考虑用户可能的实际需求。他们可能不仅需要问题列表,还希望知道每个问题背后的考察点,或者如何回答。但用户目前只问了问题范围,所以先列出常见问题,再简要说明重点。 还要注意用户身份,可能是应届生或初级开发者,准备面试时需要全面覆盖基础和高阶问题。需要涵盖四大组件、Handler机制、性能优化、第三方库、架构模式等。 另外,结合之前的回答,用户对Content Provider有一定了解,可能在面试中深入探讨组件相关的问题。需要强调四大组件的工作原理和实际应用。 同时,用户可能对系统级开发感兴趣,比如AOSP、ROM定制,但不确定,所以需要包括系统开发相关问题,如Binder机制、进程启动流程等。 需要确保回答结构清晰,分点列出,每个大类下有小点,并给出示例或关键点,帮助用户快速抓住重点。此外,要使用中文,保持专业但不失易懂。 最后,加上注意事项,提醒用户结合项目经验准备,展示实际应用能力,这样回答更全面,满足用户深层需求。</think>以下是安卓系统开发工程师面试中常见的 **技术类问题** 分类及典型问题示例,按核心领域划分: --- ### 一、基础能力考察 1. **Java/Kotlin 基础** - 多线程:`Handler/Looper` 工作原理、线程池优化策略 - 内存管理:内存泄漏检测(LeakCanary原理)、`WeakReference` 使用场景 - 示例问题: > *"为什么 Android 主线程不能直接执行耗时操作?如何通过 Handler 实现线程切换?"* 2. **Android 四大组件** - Activity 生命周期(`onSaveInstanceState` 调用时机) - Service 的 `startService` 与 `bindService` 区别 - BroadcastReceiver 的注册方式与性能影响 - ContentProvider 的 `UriMatcher` 实现原理 --- ### 二、核心机制深入 1. **Handler 机制** - `MessageQueue` 的阻塞唤醒实现(epoll 机制) - 同步屏障(Sync Barrier)的作用 - 示例代码分析: ```java new Handler(Looper.getMainLooper()).postDelayed(() -> {}, 1000); ``` 2. **Binder 跨进程通信** - AIDL 接口自动生成的 Java 类结构分析 - `Parcelable` 与 `Serializable` 的性能对比 - 一次完整的 Binder 调用流程(从 Client 到 Server) --- ### 三、性能优化实战 1. **UI 渲染优化** - 过度绘制检测与层级优化 - `Choreographer` 与 VSYNC 信号的关系 - 卡顿监控方案(基于 `Looper Printer` 或 `FrameMetrics`) 2. **内存优化** - MAT 工具分析 `Dominator Tree` 的步骤 - 大图片加载方案(`BitmapRegionDecoder` 使用) - 内存抖动排查(通过 Allocation Tracking) 3. **网络优化** - HTTP/2 多路复用机制在 Android 中的应用 - 弱网络下的策略(延迟请求合并、数据压缩) --- ### 四、架构设计能力 1. **架构模式对比** - MVC 中 Activity 的角色争议 - MVVM 中 `LiveData` 与 `DataBinding` 的耦合问题 - MVI 单向数据流在复杂业务中的优势 2. **模块化设计** - 组件化路由方案(ARouter 原理) - 依赖注入框架(Hilt 与 Dagger 的对比) - 插件化实现热修复的原理(类加载机制) --- ### 五、系统级开发问题 1. **AOSP 相关** - SystemServer 启动流程 - Zygote 进程的作用(预加载机制) - SELinux 策略文件编写规则 2. **Framework 层** - View 的事件分发机制(`onInterceptTouchEvent` 的调用逻辑) - WMS(WindowManagerService)如何管理窗口层级 - AMSActivityManagerService)的进程管理策略 --- ### 六、场景设计题 1. **跨进程数据同步** > *"设计一个跨进程的实时数据同步方案,要求保证数据最终一致性"* 2. **启动优化** > *"应用冷启动时间从 2s 优化到 800ms,请描述具体实施步骤"* 3. **崩溃防护** > *"如何实现一个不侵入业务代码的全局崩溃防护机制?"* --- ### 高频考点统计(参考大厂面试) | 考察方向 | 出现频率 | 重点问题示例 | |----------------|----------|--------------| | 自定义 View | ★★★★☆ | 实现环形进度条并支持动画 | | 多线程同步 | ★★★★☆ | `synchronized` 与 `ReentrantLock` 区别 | | Jetpack 组件 | ★★★★☆ | `ViewModel` 生命周期绑定原理 | | 性能优化 | ★★★★★ | 内存泄漏场景复现与解决 | --- ### 注意事项 1. **原理级追问**:面试官常从表面问题深入底层(如:`AsyncTask` 废弃原因 → 线程池配置缺陷 → `Executors` 的隐患) 2. **项目经验关联**:需准备 2-3 个复杂问题的解决案例(如:OOM 问题排查全过程) 3. **系统开发侧重**:ROM 定制方向会深入 Linux 内核、HAL 层等问题 建议结合 **实际项目经验** 准备答案,重点展示 **技术深度** 与 **解决问题的方法论**。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值