Gas*_*ias 8 android out-of-memory android-activity
我们一直在开发一个具有下拉式仪表板的应用程序,该仪表板允许用户在整个应用程序中导航.导航不是很标准,因为几乎每个活动都可以访问此菜单.在使用菜单播放一段时间后,堆栈开始增长和增长.
所有这些活动都包含列表视图,其中包含多个图像视图,每个活动大约需要3mb.如果用户玩得足够并在堆栈上创建了超过25个活动,则会发生以下情况:
我期待系统自动杀死堆栈中最旧的活动BEFRORE抛出OutOfMemoryError ...
为了确保操作系统不会破坏旧活动,我创建了一个每次分配1mb的测试应用程序.猜猜是什么:行为是一样的,抛出了错误的错误:
问题是:如果需要,我们如何告诉Android操作系统允许释放活动及其资源,以便我们不会得到"不幸的是,您的活动已停止".对话?
概念证明
package com.gaspar.memorytest;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MemoryTestActivity extends Activity {
/** Called when the activity is first created. */
private byte[] mData;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main1);
((Button)findViewById(R.id.button)).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent i = new Intent(MemoryTestActivity.this, MemoryTestActivity.class);
startActivity(i);
}
});
mData = new byte[1*1024*1024];
}
}
Run Code Online (Sandbox Code Playgroud)
Com*_*are 13
我期待系统在抛出OutOfMemoryError之前自动终止堆栈中最旧的活动
Android不会这样做.Android终止进程以释放其他进程的系统内存.它不会以类似的方式涉及应用程序内部内存使用.
如果需要,我们如何告诉Android操作系统允许释放活动及其资源,以便我们不会得到"不幸的是,您的活动已停止".对话?
你不能.
相反,您需要将应用程序设计为使用较少的活动,或者为每个活动使用较少的资源.例如,您可以通过"回收"现有活动实例FLAG_ACTIVITY_REORDER_TO_FRONT,或者(如Tornquist先生指出的那样),您可以finish()自己手动进行活动.
在使用菜单播放一段时间后,堆栈开始增长和增长.
您可能应该FLAG_ACTIVITY_REORDER_TO_FRONT在这些菜单项上使用,以便在任务中将现有活动转发,而不是每次都创建新活动.