美文网首页
理解Context

理解Context

作者: 咸鱼佬 | 来源:发表于2018-10-14 09:10 被阅读17次

此文为Android内核剖析学习

Context是啥

一个Context意味着一个场景,一个场景就是用户和操作系统的交互的过程。比如你打电话时,场景包括电话程序对应的界面,以及隐藏在界面后面的数据;当你看短信的时候,场景包括短信界面,以及隐藏在后面的数据

一个Activity,Service 也是一个Context

用户和系统的每一次交互都是一个场景,比如打电话,发短信,这些都是有界面的场景,也有没有界面的场景(service)。一个应用程序可以认为是一个工作环境,用户可以在这个工作环境中切换到不同的场景

Activity,Service 都是基于Context的。Activity除了基于Context类外,还实现了其他的重要接口,从设计的角度来看,interface仅仅是现实了某些功能,而extends才是类的本质

一个应用进程包含几个Context对象

Context数量 = Activity数量+Service数量+ 应用进程数量

Context相关类的继承关系

image
  • Context abstract类

  • ContextImpl 真正实现了Context中的所有函数,应用程序调用的各个Context类方法都是来自该类的实现

  • ContextWrapper Context包装类,里面包含着一个Context对象,可以通过attachBaseContext方法指定。这个包含关系用了组合关系在UML图中(感觉比聚合适合)


    image
  • ContextThemeWrapper 其内部增加了一些与主题相关的接口,这里的主题指的是Application/Activity中的主题

Application的Context

我的相关文章

1.ActivityThread#performLaunchActivity

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

2.LoadedApk#makeApplication

image

3.Instrumentation#newApplication

Application app = (Application)clazz.newInstance();
app.attach(context);
-----
//Application.attach()
final void attach(Context context) {
    attachBaseContext(context);//设置ContextWrapper的mBase,上面说过
    mLoadedApk = ContextImpl.getImpl(context).mPackageInfo;
}

4.appContext.setOuterContext(app);这里是调用ContextImpl中的方法,设置双向关联吧,有些处理可能需要回到ContextWrapper的子类中进行

Activity的Context

1..ActivityThread#performLaunchActivity

//创建Activity实例
activity = mInstrumentation.newActivity(
                cl, component.getClassName(), r.intent);

//创建ContextImpl并赋值个Activity的父类ContextWrapper中的mBase
Context appContext = createBaseContextForActivity(r, activity);

//调用Activity的attach方法
activity.attach(appContext.....);
//attach中
attachBaseContext(context);

跟Application差不多

Service的Context

ActivityThread#handleCreateService

service = (Service) cl.loadClass(data.info.name).newInstance();
ContextImpl context = ContextImpl.createAppContext(this, packageInfo);
service.attach(context, this, data.info.name, data.token, app,
                ActivityManagerNative.getDefault());
//Service attach
attachBaseContext(context);

三个ContextWrapper子类的流程基本是一致的

相关文章

  • 源码学习->05Context

    参考文章 : 1. 理解Android Context理解Application创建过程 Context : 1、...

  • Context理解

    官方文档 https://doc.react-china.org/docs/context.html#api 个人...

  • 理解Context

    此文为Android内核剖析学习 Context是啥 一个Context意味着一个场景,一个场景就是用户和操作系统...

  • 理解Context

    什么是Context Context: 字面理解为上下文,语境。Android应用模型是基于组件的应用设计模式,组...

  • 理解Context

    我们平时对Context的理解无外乎两方面: 调用Context的方法,比如启动activity,访问资源; 作为...

  • Context 理解

    继承关系 Context是个抽象类,在加载资源、启动一个Activity、获取系统服务、获取内部文件的路径,及创建...

  • 对 Context 的理解

    对 Context 的理解 1. Context的作用: Context 是应用组件的上下文,有了 Context...

  • HI,Context!

    Context的理解 context的使用场景: getResources() StartActivity() 弹...

  • 进阶之光笔记二

    第五章 理解上下文Context Context的关联类 Context使用场景:1.使用Context调用方法,...

  • context的理解

    转载自:http://blog.csdn.net/singwhatiwanna/article/details/2...

网友评论

      本文标题:理解Context

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