1.Android上下文理解
- Android上下文对象,在Context中封装一个所谓的“语境”,Activity、Service、Application都继承自Context,所以在这三者创建时都会创建应用上下文Content
- 所有的组件共同拥有Application Context,可以通过getApplicationContext()获取
- Activity中获取Context对象,直接this,匿名内部类指定XXXActivity.this
Context的作用是用来访问全局信息的,比如每个UI组件的构造函数都是要传入一个Context的。拿TextView来打比方:
TextView textView =newTextView(this); textview.setText(R.string.balabala);
这里实例化的时候传入了一个this,这个值就是一个Context。
这里设置了一个在strings.xml文件中预定义的字符串,setText(int resid)函数的源码中是这样的:
publicfinalvoidsetText(intresid){ setText(getContext().getResources().getText(resid)); }
注意这里面使用了getContext()函数去获取全局信息资源,并通过id筛选出自己想要的资源。这里的这个getContext()获取到的上下文,就是我们在实例化TextView时传进去的Context。
所以,Context是用来协助对象访问全局信息的。
使用的时候要尤其注意,Context传出去,使用完要及时释放掉,因为Context是有一个引用抓取着Activity的,如果Activity生命周期结束后还没有及时释放掉Context,很容易造成内存泄露。
2.几个常用的上下文
this
即当前的application或activity或service。
getApplication()
系统提供的单例对象,每个应用只有一个。只能在activity和service(以及application类)中调用,获得应用的application单例对象。
getApplicationContext()
getApplicationContext()返回应用的上下文,生命周期是整个应用。相对比getApplication获取的对象是一样的,都是应用的application单例对象,但是应用范围更加广,可以例如broadcast receiver中可以使用。
getBaseContext()
返回由构造函数指定或setBaseContext()设置的上下文,调用该方法时获取一个ContextWrapper初始化为具体的Application、Service、ContextThemeWrapper的context。不建议使用。
getActivity()
在fragment中获取fragment从属的activity的context,相当于该Activity的activity.this。存在于该activity的生命周期中。
getContext()
返回当前这个View对象的context。
3.今天培训讲了一点点的activity上下文以及管理的东西。
activity实际上是继承了context的上下文,只是他自己下面又实现了一些可视化的(不是window、widget)等可视化界面。
activity -> activityThread -> AMS