私たちは、ユーザーがアプリ全体をナビゲートできるようにするドロップダウン ダッシュボードを持つアプリケーションを開発してきました。このメニューはほとんどすべてのアクティビティからアクセスできるため、ナビゲーションはあまり標準的ではありません。メニューを使用してアクティビティを開いてしばらくプレイした後、スタックがどんどん大きくなり始めます。
これらのすべてのアクティビティには、内部にいくつかのイメージビューを含むリストビューが含まれており、それぞれ約 3 MB かかります。ユーザーが十分にプレイし、スタックに 25 を超えるアクティビティを作成すると、次のようになります。
- メモリ不足エラーがスローされます (ヒープがなくなるまでヒープが増加します)。
- 例外によりダイアログが表示されます (残念ながら、%activity% は停止しました。)
- outofmemerror がスローされたアクティビティは終了しました。
- スタック内のすべてのアクティビティが終了しますが、履歴が保持されるため、バックアップが可能であり、各アクティビティは OS によって自動的に再作成されます。
OutOfMemoryError がスローされる前に、システムがスタック内の最も古いアクティビティを自動的に強制終了することを期待していました...
OS が古いアクティビティを強制終了していないことを確認するために、毎回 1 MB を割り当てるテスト アプリを作成しました。推測: 動作は同じで、outofmemerror がスローされます。
問題は、「残念ながら、アクティビティが停止しました」というメッセージが表示されないように、必要に応じてアクティビティとそのリソースの割り当てを解除できることを Android OS に伝えるにはどうすればよいかということです。ダイアログ?
コンセプトの証明
パッケージ 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];
}
}