与context的关系_Framework 深入探索之Context与Application

01b9744fa04c6248a6d0d34de63b1c79.png

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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值