dan*_*joo 14 java heap android out-of-memory task
以下表格表示此问题涉及的应用程序中的工作流程.

我遇到OutOfMemory错误的问题,主要是因为用户能够多次从活动B切换到活动D(他们在每次尝试时显示不同的内容),而不会破坏先前的活动.这导致了一个非常大的backstack导致OutOfMemory错误.
为了避免这种情况,我遵循了建议,在清单中添加父活动,并使用TaskStackBuilder类创建新的backstack:
void openDFromB()
{
Intent i = new Intent(this, ActivityD.class);
TaskStackBuilder.create(this)
.addParentStack(ActivityD.class)
.addNextIntent(i)
.startActivities();
}
Run Code Online (Sandbox Code Playgroud)
如果用户现在从活动B切换到D,则销毁MainMenu,A和B并创建新的Backstack(MainMenu,C,D).这解决了api级别大10的内存问题,但不幸的是,TaskStackBuilder没有为pre api 11设备创建后台堆栈.
知道如何做以避免用户在api 11之前堆叠无限量的活动吗?这是否可能,或者我应该尝试在onPause中释放尽可能多的资源,以便在OoM之前获得最大量的堆叠活动?
提前致谢!
试试这个-
Intent intent = new Intent(getApplicationContext(),yourActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)
另一个解决方案是
android:noHistory="true"清单文件中的活动设置将在导航离开时从堆栈中删除活动.
但最合适的方法是finish()在开始新活动时调用方法,如下面的示例代码所示 -
Intent intent = new Intent(this, yourActivity.class);
startActivity(intent);
finish();
Run Code Online (Sandbox Code Playgroud)
您还可以创建自定义广播接收器,并在每个可以根据您选择的事件触发的活动中注册它.如需更多帮助,请查看此链接.
Zabri答案很好,但我建议另一个可能更好:你不要关闭每个活动,但是当你打开一个之前打开的新活动时,你告诉系统它可以清除回来并重新打开那个,当然有新的意图和你需要的所有新数据.
所以,如果你做A - B - D - B - D - B,而不是拥有那么大的筹码,你就会有
所以,如果你做C - D - B - D - B - D,你的筹码将是
等等.通过这种方式,我认为堆栈实际上反映了用户可以想到的东西,并且导航也是非常逻辑的,你甚至不需要捕获后退按钮来使导航有意义,(当然,你可以做到你想要更具体的用户体验)
实现这一目标的代码是:创建一个接收一个类(像ActivityD.class)的功能,还有你创建的意图,与国旗Intent.FLAG_ACTIVITY_CLEAR_TOP和Intent.FLAG_ACTIVITY_NEW_TASK,然后当你需要打开一个活动,只需调用这个函数.你不关心活动是否在堆栈中.如果不是,则正常创建.
protected void startActivity(Class<?> clase) {
final Intent i = new Intent(this, clase);
int flags = Intent.FLAG_ACTIVITY_CLEAR_TOP;
flags |= Intent.FLAG_ACTIVITY_NEW_TASK;
i.setFlags(flags);
startActivity(i);
}
startActivity(ActivityD.class);
Run Code Online (Sandbox Code Playgroud)