Android中很多资源文件都需要Context来加载。如果这些资源没有被释放,那么Context的引用不为null,造成对应的Activity即使调用了finish()但其占有的内存依然不能被释放。
第一种情况
比如:
Soundmanager.getInstance(this).play(SoundManager.MAIN_BG_SOUND);
这种单例模式的全局的静态方法,就不能用Activity的Context,最好用Application的Context。因为它的生命周期与引用的Activity不相同,无法释放Activity的内存。
第二种情况
比如:
ViewRoot的内部类W,
public class ViewRoot {
static class W extends IWindow.Stub{
private final WeakReference<ViewRoot> mViewRoot;
public W(ViewRoot viewRoot){
mViewRoot = new WeakReference<ViewRoot>(viewRoot);
}
}
}
不要用非静态的内部类,静态的内部类如果需要引用Activity本身,最好用弱引用来实现,这样Activity释放时不会因为被内部类引用而无法释放。