专栏首页Android 进阶Context与Application 理解

Context与Application 理解

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中使用静态变量属性

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 面试

    3.我希望下一份工作能够稳定些,多花几年时间在工作中磨砺技能,贵公司的岗位很适合我,是一个帮助我长期发挥的平台,加之我对贵公司倾慕有加。公司处于高速发展阶段,非...

    Yif
  • Java 代码优化建议

    在 Java 核心 API 中,有许多应用 final 的例子,例如 java.lang.String,整个类都是 final 的。为类指定 final 修饰符...

    Yif
  • View 事件分发

    setEnabled设置为true,相当于激活事件,对触摸产生反应,而设置成false。

    Yif
  • MySQL 复制全解析 Part 11 使用xtrabackup建立MySQL复制

    MySQL复制全解析 Part 2 一步步搭建基于二进制文件位置的MySQL复制

    bsbforever
  • 初学者玩好Linux的建议

    我把之前的一些学习经验和方法跟大家分享下,希望对大家有所帮助: 一、玩好Linux一定要经常折腾,说白了,就是动手能力一定要强。 我初学Linux那...

    wangxl
  • 99%的数据中心都会面临的痛点,现在终于有好的解决方案了!

    毫不夸张地说,现如今99%的数据中心都会面临以下这些痛点: 1 业务波动变化莫测 若为峰值设计投资买单,则成本浪费严重;若节省成本采用较低功率设计,又扛不...

    腾讯数据中心
  • react学习系列3 使用koa-router模拟后台接口

    当用create-react-app创建好项目,启动后会自动打开 localhost:3000。 我们希望当访问 localhost:3000/api/tod...

    mafeifan
  • mpvue实现周日历插件

    anna
  • Bash 强大的History 命令

    Bash的使用GUN readline库来处理用户输入,所以BASH也有emacs/vi 两种模式(主要是快捷键不同)(4DOS没有) 一般来说BASH缺省是e...

    一见
  • Spring Boot的@Configuration和自动配置有什么区别?

    我们都知道springboot的这个原理@SpringBootApplication = @Configuration + @EnableAutoConfigu...

    lyb-geek

扫码关注云+社区

领取腾讯云代金券