接触过android的码农都知道context对象可谓是无所不在啊。那么,什么情况才可能创建context实例呢?有三个地方,第一就是创建
Application对象(唯一)
时、第二就是创建
Activity对象
时、第三就是创建
Service对象
时。
虽然以上三个地方创建出来的都是context实例,但是在某些情况下,它们就会有质的差别,稍有不慎就会导致著名的“内存泄漏”问题。在这里就简单介绍一下什么叫内存泄漏了。在
Java中,
内存泄漏是指进程中某些对象(垃圾对象)已经没有使用价值了,但是它们却还直接或间接地引用到gc roots,
导致无法被GC回收。无用的对象占据着内存空间,使得实际可使用内存变小,形象地说法就是内存泄漏了。关于内存泄漏问题留意专题吧。
context 为什么会造成内存泄漏呢?关键在于,未能清晰辨别application对象创建的context实例与activity或service对象创建的context实例的区别。application是全局性的,而activity或service的生命周期却有可能小于application。如果利用activity的context去保存一些全局性的资源时,那么就有可能造成activity被摧毁时由于资源持有context对象而不能被GC回收。
这个activity对象就是一个无用的但一直占用内存的对象,即无法回收的垃圾对象。所以,对于lauchMode不是singleInstance的Activity, 应该避免在activity里面实例化其非静态内部类的静态实例。例如:
- public class MainActivityextends Activity
- {
- static Demo sInstance = null;
- @Override
- public void onCreate(BundlesavedInstanceState)
- {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- if (sInstance == null)
- {
- sInstance= new Demo();
- }
- }
- class Demo
- {
- voiddoSomething()
- {
- System.out.print("dosth.");
- }
- }
- }