Framework 窗口添加流程分析1之 ViewRootImpl 创建

本文详细剖析了Android中Activity窗口添加的过程,从ActivityThread的handleResumeActivity开始,经过performResumeActivity、makeVisible等步骤,重点讲解了ViewRootImpl的创建和View的绘制流程,涉及到WindowManagerImpl、WindowManagerGlobal以及WMS的交互。文章为理解Android应用程序界面显示的底层机制提供了深入见解。

Framework 窗口添加流程分析1之 ViewRootImpl 创建

ActivityThread.handleResumeActivity()

// 第一部分析: 执行resumed流程,回调 Activity.onResume()

-> ActivityThread.performResumeActivity()

​ -> Activity.performResume()

​ -> Activity.dispatchActivityPreResumed()

​ -> Instrumentation.callActivityOnResume()

​ -> Activity.onResume()

​ -> FragmentController.dispatchResume()

​ -> Activity.dispatchActivityPostResumed()

​ -> ActivityThread.reportTopResumedActivityChanged()

// 第二部分析: 添加窗口,绘制应用界面,使 activity 可见

-> Activity.makeVisible()

​ -> WindowManagerImpl.addView()

​ -> WindowManagerGlobal.addView()

​ -> new ViewRootImpl()

​ -> DecorView.setLayoutParams()

​ -> ViewRootImpl.setView()

​ // 第三部分析: View 的绘制

​ -> ViewRootImpl.requestLayout()

​ -> checkThread() // 检查线程是不是创建 ViewRootImpl 的原始线程(可以大概理解为主线程)

​ -> mLayoutRequested = true

​ -> scheduleTraversals()

​ -> mHandler.getLooper().getQueue().postSyncBarrier()

​ -> mChoreographer.postCallback(Choreographer.CALLBACK_TRAVERSAL, mTraversalRunnable)

​ -> mHandler.getLooper().getQueue().removeSyncBarrier(mTraversalBarrier);

​ -> performTraversals()

​ -> performMeasure()

​ -> performLayout()

​ -> performDraw()

​ -> Session.addToDisplayAsUser() // Binder call

​ -> WMS.addWindow()

​ -> DecorView.setVisibility()

// frameworks/base/core/java/android/app/ActivityThread.java
@Override
public void handleResumeActivity(IBinder token, boolean finalStateRequest, boolean isForward,String reason) {
   
   
    // 省略部分
    // 这里会执行resumed相关流程,同时会回调 Activity.onResume()
    final ActivityClientRecord r = performResumeActivity(token, finalStateRequest, reason);
    if (r == null) {
   
   
        // We didn't actually resume the activity, so skipping any follow-up actions.
        return;
    }
    final Activity a = r.activity;

    if (!r.activity.mFinished && willBeVisible && r.activity.mDecor != null && !r.hideForNow) {
   
   
        // 省略部分
        r.activity.mVisibleFromServer = true;
        mNumVisibleActivities++;
        if (r.activity.mVisibleFromClient) {
   
   
            // 添加窗口,绘制应用界面,使 activity 可见
            r.activity.
### Android WMS 实现与解决方案 对于在Android平台上实现WMS (Web Map Service),可以考虑使用GeoWebCache作为缓存服务器来提供高效的瓦片服务。GeoWebCache是一个用Java编写的切片缓存服务器,能够为多种地理信息系统(GIS)应用程序提供快速的地图图像访问[^1]。 为了实现在Android设备上的WMS功能,通常会采用以下技术栈: #### 使用开源库简化开发过程 - **MapLibre GL**: 这是一款基于GL ES的跨平台地图渲染引擎,适用于iOS和Android应用中的交互式矢量地图显示。通过集成此SDK,开发者可以在移动客户端轻松加载并操作来自不同来源的服务层,包括WMS图层。 ```java // 添加依赖项到build.gradle文件中 dependencies { implementation 'com.mapbox.maps:mapbox-maps-android:10.0.0' } ``` - **OSMDroid**: OSMDroid是另一个流行的用于离线或在线地图可视化的开源项目。它支持从多个提供商获取栅格瓦片,并允许自定义叠加其他类型的地理要素,比如由WMS返回的数据集。 ```xml <!-- 在布局XML中配置MapView --> <org.osmdroid.views.MapView android:id="@+id/mapview" android:layout_width="match_parent" android:layout_height="match_parent"/> ``` #### 结合轻量化数据库增强性能 考虑到移动端资源有限,在处理大量空间数据时推荐搭配SpatiaLite一起工作。作为一种嵌入式的SQL扩展工具包,SpatiaLite使得SQLite具备强大的几何运算能力,从而有助于优化本地存储结构以及加速查询响应速度[^3]。 ```sql SELECT AsText(Transform(MakePoint(-71.108194, 42.356789), 4326)); -- 创建一个新表用来保存地理位置记录 CREATE TABLE places ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, geom POINT); ``` 除了上述提及的技术组件外,构建完整的Android端WMS方案还需要关注网络通信机制的设计、用户界面友好性的提升等方面因素。同时也要注意遵循开放标准协议的要求,确保与其他系统的互操作性和兼容性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值