美文网首页
Activity Context 对比 Application

Activity Context 对比 Application

作者: ahking17 | 来源:发表于2016-09-08 15:44 被阅读181次
    类图:
    context.jpg
    1.

    Context类本身是一个纯abstract类,它有两个具体的实现子类:ContextImpl和ContextWrapper。
    ContextWrapper是包装类, 调用ContextWrapper的方法都会被转向其所包含的真正的ContextImpl对象。

    2.

    ContextThemeWrapper类,如其名所言,其内部包含了与主题(Theme)相关的接口,这里所说的主题就是指在AndroidManifest.xml中通过android:theme为Application元素或者Activity元素指定的主题, 当然,只有Activity才需要主题,Service是不需要主题的,因为Service是没有界面的后台场景,所以Service直接继承于ContextWrapper,Application同理。

    3.

    一个应用程序有几个Context?
    Context数量=Activity数量+Service数量+1
    可能会有疑问:我们常说四大组件,这里怎么只有Activity,Service持有Context,那Broadcast Receiver,Content Provider呢?Broadcast Receiver,Content Provider并不是Context的子类,他们所持有的Context都是其他地方传过去的,所以并不计入Context总数。

    4.

    Context能干什么?
    弹出Toast、启动Activity、启动Service、发送广播、操作数据库等等都需要用到Context.

    context作用.jpg

    在绝大多数场景下,Activity、Service和Application这三种类型的Context都是可以通用的。不过有几种场景比较特殊,比如启动Activity,还有弹出Dialog。
    出于安全原因的考虑,Android是不允许Activity或Dialog凭空出现的,一个Activity的启动必须要建立在另一个Activity的基础之上,也就是以此形成的返回栈。而Dialog则必须在一个Activity上面弹出(除非是System Alert类型的Dialog),因此在这种场景下,我们只能使用Activity类型的Context,否则将会出错。

    一句话总结:凡是跟UI相关的,都应该使用Activity做为Context来处理;其他的一些操作,Service,Activity,Application等实例都可以.
    5.

    static对象不要持有Activity Context对象, 否则导致Activity退出时(onDestroy()被调用), Activity Context对象无法被销毁.
    static对象应该持有和static对象同生命周期的Application Context对象.

    refer to:
    http://gold.xitu.io/entry/573b27e7df0eea005e71c425

    相关文章

      网友评论

          本文标题:Activity Context 对比 Application

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