前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Context与Application 理解

Context与Application 理解

作者头像
Yif
发布2020-04-24 10:44:01
1.5K0
发布2020-04-24 10:44:01
举报
文章被收录于专栏:Android 进阶

Context 理解

Context的作用

首先来谈一谈Context 什么是Context以及作用

它是应用环境的全局接口,一个抽象类,它的实现是由Android系统提供,是一个系统资源类,启动Activity,发送广播 其中Application、activity与service中有context,广播与contentProvider没有context 那application中的Context创建流程是怎么样的,下面就来谈一谈创建流程 application的context创建:与application一起初始化,通过Zygote调用fork出一个进程,然后执行一个入口函数activitythread的main函数,向ams报告启动好了,让应用创建application,内部调用handleBindApplication先创建application对象,再执行application的onCreate回调,创建application,是由newApplication内部调用ClassLoader加载类,调用clazz.newInstance,调用attach传入上下文对象

Application的结论

总结以下结论:

  • 继承关系:Application<-ContextWrapper<-Context
  • 调用顺序:<init>->attachBaseContext->onCreate
  • ContextWrapper里包含一个Context,调用都委托给他

不同组件Context的区别

Context在不同组件也有区别,下面一一列出不同,这里的Activity与Service中Context的作用是相同的,就不再列出Service中Context的作用

  1. ActivityContext作用:跟随activity一起启动,内部调用performLaunchActivity,newActivity,classLoad加载,newInstance返回Activity对象,最后执行activityonCreate对象
    • 继承关系:Activity<-ContextThemeWrapper<-ContextWrapper
    • 调用顺序:<init>->attachBaseContext->onCreate
  2. BroadcastReceive;动态注册是注册时用的context,静态注册是以application为mBase的ContextWrapper
  3. ContentProvider:初始化传入的application的context,它onCreate在applicationonCreate之前调用

应用里面有多少个Context

Context的数量等于Activity的个数 + Service的个数 + 1,这个1为Application.

Activity里的this和getBaseContext的区别

  • this返回的是activity对象自己
  • getBaseContext返回的是ContextWrappermBase

getApplication与getApplicationContext的区别

  • getApplicationContext是Context的抽象函数
  • getApplicationactivity与service特有的,广播不能调用获取context,只能调用 getApplicationContext

应用组件构造,onCreate、attachBaseContext调用顺序

组件构造->attachBaseContext传入上下文->onCreate

Application 理解

Application作用

  • 保存应用进程内的全局变量,使用单例更合适
  • 进行一些组件的初始化操作,可以异步线程初始化框架
  • 提供应用上下文,生命周期长,又很早存活
  • 应用开启进程个数与Application数量相等,多个进程对应多个Application

Application类继承以及生命周期

  1. 继承自ContextWrapper,所以调用是交给mBase,如果通过反射替换掉mBase,那么Application调用也会更换
  2. 生命周期:构造函数,attachBaseContext,onCreate
    • 入口函数main函数:准备主线程消息循环,初始化一个java类ActivityThread,它并不是线程
    • new Application ->application.attachBaseContetx->application.onCreate,不要在构造函数中使用上下文,由于还没有准备好

Application注意点

下面有两个注意点,是我们在开发过程的尤其要注意的,否则,对我们的应用有很大的影响 首先第一点就是:

  • 不要在生命周期中执行耗时操作,内部源码中调用bindAppication在UI线程中执行。AMS不受影响,是oneway,发起调用就会返回,不会等待结果。会耽误应用要启动的组件

第二点也要注意:

  • 在Application中使用静态变量会出现问题 比如在application中有一个静态变量name,在mainActivity中设置这个类,马上跳转到TestActivity中获取这个值,但是此时切换到后台,系统会因为内存不足,在切回来,就会重建这个应用,创建Application,恢复testActivity,此时Applicationname就是空值,报空指针异常,所以说避免在Application中使用静态变量属性
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020年4月23日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Context 理解
    • Context的作用
      • Application的结论
    • 不同组件Context的区别
      • 应用里面有多少个Context
        • Activity里的this和getBaseContext的区别
          • getApplication与getApplicationContext的区别
            • 应用组件构造,onCreate、attachBaseContext调用顺序
            • Application 理解
              • Application作用
                • Application类继承以及生命周期
                  • Application注意点
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档