博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android(七)、 ContextImpl创建
阅读量:5313 次
发布时间:2019-06-14

本文共 1873 字,大约阅读时间需要 6 分钟。

android Context意为上下文,是应用程序所在环境的一个信息描述,一个全局工具,可以创建服务,访问资源文件等。

Context本身是一个抽象类,他的实现类有很多个包括ContextImpl和ContextThemeWrapper。

通常大家会用Context来启动Service,发送广播,启动Activity和进行资源访问,这些功能都是通过ContextImpl实现的。

本以为Activity继承了ContextImpl,后来发现并不是那样的;Activity只是继承了ContextThemeWrapper,然而ContextThemeWrapper并没有干什么有用的事只是调用baseContext的方法,最好不的事是baseContext类型竟然让是Context类型,丝毫看不出和ContextImpl是否有联系;既然这样那么就要找出是谁为baseContext赋的值。

通过分析Activity的启动过程发现创建Activity的时候调用了一个名叫createBaseContextForActivity方法,该方法的实现就是创建ContextImpl实例

 

private Context createBaseContextForActivity(ActivityClientRecord r,2190            final Activity activity) {2191        ContextImpl appContext = new ContextImpl();2192        appContext.init(r.packageInfo, r.token, this);2193        appContext.setOuterContext(activity);21942195        // For debugging purposes, if the activity's package name contains the value of2196        // the "debug.use-second-display" system property as a substring, then show2197        // its content on a secondary display if there is one.2198        Context baseContext = appContext;2199        String pkgName = SystemProperties.get("debug.second-display.pkg");2200        if (pkgName != null && !pkgName.isEmpty()2201                && r.packageInfo.mPackageName.contains(pkgName)) {2202            DisplayManagerGlobal dm = DisplayManagerGlobal.getInstance();2203            for (int displayId : dm.getDisplayIds()) {2204                if (displayId != Display.DEFAULT_DISPLAY) {2205                    Display display = dm.getRealDisplay(displayId);2206                    baseContext = appContext.createDisplayContext(display);2207                    break;2208                }2209            }2210        }2211        return baseContext;2212    }

Activity创建过程中为attach传入了ContextImpl实例,这样activity便和ContextImpl有了联系,也符合应用中Activity调用ContextImpl的实现的现象

 

转载于:https://www.cnblogs.com/qcjd/p/9324860.html

你可能感兴趣的文章
No Language-Support in system setting ,Ubuntu
查看>>
spring 实现测试解耦
查看>>
Python学习笔记第二十一周
查看>>
js 获取视频的第一帧
查看>>
各种正则验证
查看>>
C#中IS和AS操作符的区别(转)
查看>>
win7远程桌面连接
查看>>
深入浅出JMS(一)——JMS简单介绍
查看>>
[PTA] 数据结构与算法题目集 6-4 链式表的按序号查找 & 6-5 链式表操作集 & 6-6 带头结点的链式表操作集...
查看>>
观察者模式(Observer)
查看>>
DPDK编译步骤
查看>>
Python基础理论 - 面向对象
查看>>
数据仓库建设—维度建模
查看>>
(转载)Ubuntu 安装GNU Scientific library(GSL)
查看>>
java Map常用方法封装
查看>>
欧几里德与扩展欧几里德算法
查看>>
python中深浅拷贝
查看>>
python中numpy.r_和numpy.c_
查看>>
MySQL关于sql_mode的修改(timestamp的默认值不正确)
查看>>
laravel如何打印orm封装的sql语句
查看>>