Android 为什么Tivity仍然使用RAM altough调用finish()来实现它?

Android 为什么Tivity仍然使用RAM altough调用finish()来实现它?,android,memory,android-activity,Android,Memory,Android Activity,在我的应用程序中,有一些活动使用高分辨率PNG进行图形化处理。我有OutOfMemoryError错误,并通过将android:largeHeap=“true”添加到清单文件来修复它 联想Vibe P1(总共3GB内存) 在内存监视器中,第二个活动会增加100+MB的RAM,而不会减少为其调用的finish()函数。以下是启动第三个活动的代码: public void start_game(View v){ header.setText("Loading..."); Inten

在我的应用程序中,有一些活动使用高分辨率PNG进行图形化处理。我有
OutOfMemoryError
错误,并通过将
android:largeHeap=“true”
添加到清单文件来修复它

联想Vibe P1(总共3GB内存)

在内存监视器中,第二个活动会增加100+MB的RAM,而不会减少为其调用的
finish()
函数。以下是启动第三个活动的代码:

public void start_game(View v){
    header.setText("Loading...");
    Intent i = new Intent(this,game.class);
    i.putExtra("episode",Integer.parseInt(v.getTag().toString()));
    i.putExtra("online",false);
    startActivity(i);
    finish();
}
如何从UI和RAM中完全删除活动?

按下内存监视器中的“垃圾车”图标。
这将强制垃圾收集器运行并清理可释放的内存。
系统将在需要时自行执行此操作,并在活动完成后的某个时间点执行此操作,但不一定在活动结束后立即执行


如果运行gc没有释放内存,那么仍然存在对数据的引用。例如,它可以是静态变量或单例对象。您必须对代码进行更多的分析,以找出可能的位置。

对于API级别11及更高版本,您可以尝试清除历史堆栈,看看这是否会使以前的活动也释放RAM

Intent i = new Intent(this,game.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
对于API=>10,您可以使用(参见此)类,类似

IntentCompat.FLAG_ACTIVITY_CLEAR_TASK

因此,您也可以支持API 11级之前的版本

首先,android:largeHeap=“true”只是一条绷带,并不是OOM的真正答案,因为它并没有真正解决真正的OOM问题,即代码的糟糕实现。第二个
finish()