1· Context类型
       我们知道,Android应用都是使用Java语言来编写的,那么大家可以思考一下,一个Android程序和一个Java程序,他们最大的区别在哪里?划分界限又是什么呢?其实简单点分析,Android程序不像Java程序一样,随便创建一个类,写个main()方法就能跑了,而是要有一个完整的Android工程环境,在这个环境下,我们有像Activity、Service、BroadcastReceiver等系统组件,而这些组件并不是像一个普通的Java对象new一下就能创建实例的了,而是要有它们各自的上下文环境,也就是我们这里讨论的Context。可以这样讲,Context是维持Android程序中各组件能够正常工作的一个核心功能类。
      下面我们来看一下Context的继承结构:
         Context的继承结构还是稍微有点复杂的,可以看到,直系子类有两个,一个是ContextWrapper,一个是ContextImpl。那么从名字上就可以看出,ContextWrapper是上下文功能的封装类,而ContextImpl则是上下文功能的实现类。而ContextWrapper又有三个直接的子类, ContextThemeWrapper、Service和Application。其中,ContextThemeWrapper是一个带主题的封装类,而它有一个直接子类就是Activity。
          那么在这里我们至少看到了几个所比较熟悉的面孔,Activity、Service、还有Application。由此,其实我们就已经可以得出结论了,Context一共有三种类型,分别是Application、Activity和Service。这三个类虽然分别各种承担着不同的作用,但它们都属于Context的一种,而它们具体Context的功能则是由ContextImpl类去实现的。
          那么Context到底可以实现哪些功能呢?这个就实在是太多了,弹出Toast、启动Activity、启动Service、发送广播、操作数据库等等等等都需要用到Context。由于Context的具体能力是由ContextImpl类去实现的,因此在绝大多数场景下,Activity、Service和Application这三种类型的Context都是可以通用的。不过有几种场景比较特殊,比如启动Activity,还有弹出Dialog。出于安全原因的考虑,Android是不允许Activity或Dialog凭空出现的,一个Activity的启动必须要建立在另一个Activity的基础之上,也就是以此形成的返回栈。而Dialog则必须在一个Activity上面弹出(除非是System Alert类型的Dialog),因此在这种场景下,我们只能使用Activity类型的Context,否则将会出错。
         

2. Context数量

          那么一个应用程序中到底有多少个Context呢?其实根据上面的Context类型我们就已经可以得出答案了。Context一共有Application、Activity和Service三种类型,因此一个应用程序中Context数量的计算公式就可以这样写:
Context数量 = Activity数量 + Service数量 + 1  
        上面的1代表着Application的数量,因为一个应用程序中可以有多个Activity和多个Service,但是只能有一个Application。
 
 

最新文章

  1. O2O、C2C、B2B、B2C的区别
  2. CSS3实现边框锯齿效果
  3. HTML5移动Web开发(三)——在移动网站中使用HTML5
  4. Android笔记:实现点击事件
  5. 【python cookbook】【数据结构与算法】3.保存最后N个元素
  6. localStorage的跨与实现方案
  7. ExtJS 4 树
  8. Android批量图片载入经典系列——使用LruCache、AsyncTask缓存并异步载入图片
  9. JAVA与JSON的序列化、反序列化
  10. 使用react-native做一个简单的应用-04界面主框架
  11. App间相互跳转及图片分享
  12. java-多线程(下)&GUI
  13. 【建模应用】PCA主成分分析原理详解
  14. Apache Hive处理数据示例
  15. ural1855 线段树区间更新+推公式维护一元二次式
  16. Exception in Spark
  17. 2.python函数编程-filter函数
  18. cdnbest节点安装后连不上cdn主控原因排查
  19. IntelliJ idea 的破解
  20. ASP.NET MVC网站使用新浪微博账号登录

热门文章

  1. 关于 unsigned long long 于 long long
  2. Android事件分发和消费机制(转载)
  3. React 的几个需要注意的地方
  4. ubuntu 配置 samba服务器
  5. 使用KindEditor完成图片上传(springmvc&fastdfs/springmvc&ftp)
  6. ubuntu18.04 安装docker
  7. Django获取Header中的信息
  8. 你不知道的https工作原理
  9. C语言位运算、移位运算 经典示例
  10. [转]Format a ui-grid grid column as currency