我想要实现:Android的内存管理中的onStop活动(或关闭屏幕)
- 减少活动的内存使用情况是在屏幕上不再,即另一个活动已经开始
- 此活动仍然处于导航堆栈中的能力,所以我假设我将不得不重新构建onStart内onStop中销毁的内容,但不知道如何在所有视图/按钮均使用layout构建时如何执行此操作.xml的。
的情况:
我有一个Android应用程序,这是非常沉重的形象,但这些图片是静态的许多布局的,具有相同的背景,按钮图像,导航等头这导致我通过在layout.xml文件中指定所有的imageViews,它们的src属性和位置,可以非常容易地构建布局,而不会触及代码太多。而且这个工作很好,很容易起来和运行,但是现在有很多关于由于超过内存使用而关闭的报告。
在试图清理于是就,并允许GC删除的图像和看法不在屏幕上,我读到一篇文章来(见问题的底部)的onDestroy方法中建议,抓住你的根保持元素在布局中递归地遍历树去除视图并将其解除绑定。但是,只有当后退按钮被按下时,才会触发,并且根据文档没有保证。
因此,当我将新活动推入堆栈并且不想清理刚刚离开屏幕的内容时,onDestroy并不能帮助我。但使用onDestroy方法的优势在于入口点从onCreate开始,所以视图都是正确构建的。当我在onStop中使用这个方法时,当我开始一个新的活动时,内存get得到了很好的清理,但是因为我已经使用layout.xml构建了所有的视图,所以我不明白我需要什么或者什么如果我在onStop中销毁所有内容,重新构建onStart,尤其是考虑到我从未在代码中创建任何视图,因为它们都是由layout.xml文件设置的。
主要问题:当我开始一个新的活动时如何清理内存?如果上下文处理正确,gc是否会清理所有不在屏幕上的图像并自动重新构建它?
这可以在onStop中以某种方式使用吗?
@Override
protected void onDestroy() {
super.onDestroy();
unbindDrawables(findViewById(R.id.RootView));
System.gc();
}
private void unbindDrawables(View view) {
if (view.getBackground() != null) {
view.getBackground().setCallback(null);
}
if (view instanceof ViewGroup) {
for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
unbindDrawables(((ViewGroup) view).getChildAt(i));
}
((ViewGroup) view).removeAllViews();
}
}