![01b9744fa04c6248a6d0d34de63b1c79.png](https://i-blog.csdnimg.cn/blog_migrate/2198c5dbc1f6144e38b3f45e08f8c8b2.jpeg)
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. Activity
的Context
作用:跟随activity一起启动,内部调用performLaunchActivity,newActivity,classLoad
加载,newInstance
返回Activity
对象,最后执行activity
的onCreate
对象 - 继承关系: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
返回的是ContextWrapper
的mBase
getApplication与getApplicationContext的区别
getApplicationContext
是Context的抽象函数getApplication
是activity与servic
e特有的,广播不能调用获取context,只能调用getApplicationContext
应用组件构造,onCreate、attachBaseContext调用顺序
组件构造->attachBaseContext
传入上下文->onCreate
Application 理解
Application作用
- 保存应用进程内的全局变量,使用单例更合适
- 进行一些组件的初始化操作,可以异步线程初始化框架
- 提供应用上下文,生命周期长,又很早存活
- 应用开启进程个数与
Application
数量相等,多个进程对应多个Application
Application类继承以及生命周期
- 继承自
ContextWrapper
,所以调用是交给mBase
,如果通过反射替换掉mBase
,那么Application
调用也会更换 - 生命周期:构造函数,
attachBaseContext,onCreate
- 入口函数main函数:准备主线程消息循环,初始化一个java类ActivityThread,它并不是线程
new Application ->application.attachBaseContetx->application.onCreate
,不要在构造函数中使用上下文,由于还没有准备好
Application注意点
下面有两个注意点,是我们在开发过程的尤其要注意的,否则,对我们的应用有很大的影响 首先第一点就是: - 不要在生命周期中执行耗时操作,内部源码中调用bindAppication
在UI线程中执行。AMS不受影响,是oneway
,发起调用就会返回,不会等待结果。会耽误应用要启动的组件
第二点也要注意: - 在Application中使用静态变量会出现问题
比如在application
中有一个静态变量name,在mainActivity
中设置这个类,马上跳转到TestActivity
中获取这个值,但是此时切换到后台,系统会因为内存不足,在切回来,就会重建这个应用,创建Application
,恢复testActivity
,此时Application
的name
就是空值,报空指针异常,所以说避免在Application中使用静态变量属性