context(Activity的Context和Application的Context)
一.
Android系统的角度来理解:Context是一个场景,代表与操作系统的交互的一种过程。
从程序的角度上来理解:Context是个抽象类,而Activity、Service、Application等都是该类的一个实现。
二.
XXXActivity.this与getApplicationContext的区别,前者是XXXActivity的对象,后者是项目的Application的实例。
三.
使用context时,注意内存泄漏,如果一个对象,长久的持有一个Context对象,比如下面
static A a = new A(context);
如果此context是Activity的对象,那么只要这个项目没有被关闭,则此Activity无法被回收掉,造成内存泄漏
可以使用context.getApplicationContext(),传入整个项目的context,就不会发生泄漏了
static A a = new A(context.getApplicationContext());
四.
下图出自(http://blog.youkuaiyun.com/lmj623565791/article/details/40481055,出自:【张鸿洋的博客】)
可以看到Application不应该去拿来做UI的操作,应该使用Activity作为context来处理,其他的比如Service,Activity,Application等实例都可以使用。只是注意Activity容易出现内存泄露问题。
五.Context数量
Context一共有Application、Activity和Service三种类型:
Context数量 = Activity数量 + Service数量 + 1
上面的1代表着Application的数量,因为一个应用程序中可以有多个Activity和多个Service,但是只能有一个Application。
六.Android获取各种Context
-
getApplicationContext(); 返回一个
-
getBasecontext(); 如在onClick回调中,不能使用this时,可以使用此方法表示当前context
-
getApplication(); 只能被Activity和Service使用,
-
getParent() : 返回activity的上下文,当在子视图里面调用的话就返回一个带有子视图的activity对象
-
getActivity(); 在fragment中使用,返回该fragment所依附的activity上下文
-
this 记住Activity,Service类,Application类是继承自Context类的,所以在有的时候需要上下文,只需要使用this关键字即可,但是有的时候再线程里面,this关键字的意义就改变了,但这个时候如果需要上下文,则需要使用 类名.this,这样就可以了
《参考:https://www.cnblogs.com/chenxibobo/p/6136693.html 作者:chenxibobo》