Context是什么?

根据个人理解Context这个“上下文”是Android 系统的一个应用信息的描述类,也是对一些基础操作的抽象类。包含了比如StartActivity、StartService、registerReceiver等操作的抽象,同时提供了一些系统的配置信息,常量信息。Context本身不做任何操作,通过阅读源码我们知道,Context它有两个直接子类一个ContextImpl、一个ContextWrapper。ContextWrapper对Context进行了一层包装,内部通过一个mBase来调用Context实现的方法。真正实现了Context的就是ContextImpl,在它内部做了对系统启动,Activity启动,服务启动关系等的操作。

ContextWrapper内部的mBase对象实际上就是ComtextImpl对象的实例。在ActivityThread类中Activity启动流程中调用handleLaunchActivity()方法的时候会创建一个ContextImpl对象,同时通过classLoader类加载的方式创建完成Activity,调用Activity的attach()方法传递了刚刚创建的ContextImpl对象,在attach方法中会调用一个attachBaseContext(context),而Activity继承了ContextThemeWrapper,ContextThemeWrapper继承了ContextWrapper,最终通过super.attachBaseContext()把ContextImpl传递到了ContextWrapper中。

对于Service也是同样的过程,在startService的时候最后在ActivtyThread类中,调用handleCreateService(),在这个方法创建了ContextImpl,通过classLoader创建了Service对象,最后调用了Service的attach()方法把ContextImpl传递给Service然后调用attachBaseContext最后传递给了ContextWrapper类。

Application是什么?

前面讲了在ActivityThreadhandleLaunchActivity会创建Activity,同时这里也会创建Application的对象。在这里调用了ActivityClientRecord对象的LoadedApk对象的makeApplication方法来创建一个Application。最后又调用了Instrumentation的makeApplication方法通过classLoader的方式创建,创建成功后调用Application的attach(context)方法传递了前面刚刚创建的ContextImpl对象给Application,所以通过Applicaiton我们能完成Context的一些操作。同样在attach中会调用ContextWrapper的attachBaseContext方法赋值。

前面说创建完成Activity后会调用其attach方法,这里也会把Application传递给Activity。我们在Activity中经常调用一个getApplication方法获取Application,这个getApplication是Activity的方法,就是返回了刚刚通过LoadedApk的makeApplication创建传递来的Application对象。

在开发中我们还会用到一个getApplicationContext(),这个方法也是Context的方法。我们在Activity中调用的时候访问了ContextWrapper的方法,最后交给mBase来实现。

看下mBase也就是ContextImpl的getApplicaitonContext方法实现:

ContextImpl中判断了两个来源:

查看mPackageInfo.getApplication()方法,直接返回了mApplication。而这个mApplication的赋值来自于LoadedApk类的对象mPackageInfo的makeApplication方法。

查看mMainThread.getApplication();

查看mInitialApplication的赋值,来到了handleBindApplication()方法中,依然调用了makeApplication创建Application,并赋值。

而在makeApplication方法中看到,首先判断了mApplication是否为空,不为空直接返回。

也就是说mApplication这是一个单例对象。

最终我们知道了getApplication和getApplicationContext其实返回的都是makeApplication创建的对象。只是创建的时机不同,如果已经创建了就不同重复,返回同一个对象

LoginActivityMainActivity中分别调用getApplicationgetApplicationContext测试返回的对象是不是同一个:

输出结果:

由输出结果可以看出不同的两个Activity页面getApplicationgetApplicationContext返回的对象是同一个。

最后总结

Context是一个抽象类,定义了系统的一些操作和常量,Context有两个直接子类ContextWrapper和ContextImpl,其中ContextImpl是真正的实现类,实现了对系统组件的操作。ContextWrapper拥有ContextImpl的一个引用。

ContextWrapper有三个直接子类ContextThemeWrapper、Application和Service。其中ContextThemeWrapper来处理一些有关Theme的逻辑,ContextThemeWrapper有一个子类Activity。

Content是什么?Android中的Content、Activity、Application 有什么区别?相关推荐

  1. ANDROID 中UID与PID的作用与区别

    ANDROID 中UID与PID的作用与区别 PID:为Process Identifier, PID就是各进程的身份标识,程序一运行系统就会自动分配给进程一个独一无二的PID.进程中止后PID被系统 ...

  2. c语言 long和short区别,5分钟读懂Android 中的toast short 和long的区别

    android 中的toast short 和long的区别,在Android源码中的NotificationManagerService.java这个类中定义了两个静态变量,分别对应Toast.LE ...

  3. android raw文件作用,Android 中raw和assets文件夹的区别

    Android 中raw和assets文件夹的区别 发布时间:2020-09-25 08:40:41 来源:脚本之家 阅读:103 作者:lqh Android 中raw和assets文件夹的区别 以 ...

  4. Android中BroadCast与Activity之间的通信

    在看本文之前,假设你对于Android的广播机制不是非常了解.建议先行阅读我转载的一篇博文:图解 Android 广播机制. 因为本案例比較简单,故直接在此贴出代码,不做过多的阐述. 先上效果截图: ...

  5. android中的所有activity间动画跳转

    在之前的一篇博客里介绍过activity间动画跳转的问题,但是真正做软件发现并不能满足我们的要求,因为使用overridePendingTransition(int enterAnim, intexi ...

  6. android中获取context的多种方法的区别(this,getbascontext(),getApplicationcontext())

    本文转自:http://www.eoeandroid.com/thread-171104-1-1.html 原文转自:http://stackoverflow.com/questions/102697 ...

  7. Android中PID与UID的作用与区别

    PID:为Process Identifier, PID就是各进程的身份标识,程序一运行系统就会自动分配给进程一个独一无二的PID.进程中止后PID被系统回收,可能会被继续分配给新运行的程序,但是在a ...

  8. android中转换content://media/external/images/media/539163为/storage/emulated/0/DCIM/Camera/IMG_20160807_

    在上传照片时遇到上传路径异常:content://media/external/images/media/539163 转成:/storage/emulated/0/DCIM/Camera/IMG_2 ...

  9. Android中1像素Activity进程保活

    背景 Android8.0马上就要发布,Google对于安卓市场上各种应用占据内存空间的问题不断进行内存完善,我们的应用进程很难再保持不死之身,以前的服务唤醒在5.0已经失效,现在我们尽可能的做到保活 ...

  10. Android中打包含有Activity以及资源文件的jar包在工程中调用

    如何将资源以及activity文件打包成jar文件供项目调用,从android的官方文档中找到的完美的解决,这里做一个总结. 最近刚刚发布了一款小应用<诗词大全>,有兴趣的朋友请实用提出您 ...

最新文章

  1. 腻害了!同事写了个隐藏 Bug,我排查了 3 天才解决问题!
  2. Router OS之禁止P2P下载
  3. android 键盘搜索按钮不收起键盘,android EditText 实现搜索框点击搜索隐藏键盘
  4. Zabbix配置微信报警通知
  5. 【虚拟化】docker部署nginx
  6. oracle隐藏游标,Oracle 存储过程隐藏游标
  7. 高薪Java工程师必看的书籍
  8. 6.11python 作业
  9. mysql+视频文件转成流_视频文件自动转rtsp流
  10. jetbrains全家桶中好用的快捷键插件:Key Promoter X
  11. 算法总结之 在数组中找到一个局部最小的位置
  12. 在 ArcView 3.3 中裁剪 DEM 数据
  13. 你要清楚SEO内容优化注意事项
  14. 四阶龙格库塔法的基本思想_四阶龙格库塔法(Runge-Kutta)求解微分方程.PDF
  15. 京瓷p5018cdn教程_京瓷ECOSYS P5018cdn驱动
  16. Error:Excepted resource of type id
  17. c语言快速幂,快速幂
  18. Java中的日期和时间
  19. Openbravo如何新建一个调用
  20. MySQL之——基本操作汇总

热门文章

  1. ADO.NET 概述
  2. 2021秋季《数据结构》_EOJ 1086.哥尼斯堡的七桥问题
  3. MySQL初始密码忘记了怎么办
  4. 全网最全编程学习网站汇总
  5. 博客园申请理由写这1句话,居然12分钟就能开通成功!
  6. 一学就会的虚拟化技术之hyper-v桌面虚拟化
  7. su如何变成实体_Sketchup实体工具怎么使用? SU实体工具的使用方法
  8. Windows10 如何禁用或删除大的Hiberfil.sys和Pagefile.sys文件
  9. VPS安装Docker、docker-compose
  10. 国内好用的五款开源建站系统