我正在开发一个多关卡游戏,每个关卡都是一项新活动。
我想知道,如果我改变活动,比如
Intent myIntent = new Intent(getBaseContext(), Level3.class);
startActivity(myIntent);
Level 1 和 2 使用的内存被清除了?
如果没有,我怎样才能清除上一级活动中的所有内容,以便手机仅将内存用于当前活动?
我不建议您为每个游戏级别创建活动。最好创建一些控制器来在一个活动中初始化你的游戏关卡。当然,它必须有一些方法来清除最后阶段的内存,如下所示:
class StageManager
{
public Stage curStage;
public initStage(Stage stage)
{
//init stage here
curStage = stage;
stage.init();
}
public clearStage()
{
//do some clearing staff
curStage .clear();
}
}
abstract class Stage
{
public abstract init();
public abstract clear();
}
abstract class FirstStage extends Stage
{
//....
}
abstract class SecondStage extends Stage
{
//....
}
在活动中:
StageManager stageManager = new StageManager();
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.your_view);
stageManager.init(new FirstStage());
}
@Override
public void onClick(View theView)
{
int id = theView.getId();
if (id == R.id.btnNextLevel) {
stageManager.clear();
stageManager.init(new SecondStage());
}
}
您可以使用 Fragmets 代替您的自定义管理器:
在这两种方式中 - 片段或您自己的经理,您会将不同的阶段逻辑分离到不同的类。
Youd 不需要创建另一个 Activity 来分隔你的 1000 多行代码。只需使用 Stage 或 Stratagy 设计模式之一。
如果您仍想使用活动,只需执行以下操作:
Intent myIntent = new Intent(getBaseContext(), Level3.class);
startActivity(myIntent);
finish();
在 onDestroy() 中:
@Override
protected void onDestroy()
{
//here you must clear all data that were used in this Stage (Activity) like this :
clearMemmory();
super.onDestroy();
}
private void clearMemmory()
{
if(stageData!=null)
{
stageData.clear();
stageData =null;
}
}
或在打开另一个阶段之前直接清除内存,例如:
clearMemmory();
Intent myIntent = new Intent(getBaseContext(), Level3.class);
startActivity(myIntent);
finish();
最好的祝愿。
由于您使用的是活动/关卡设计,因此只需在 onPause 方法中添加检查您的活动是否正在完成,并将您对当前关卡的所有引用清空,这样 GC 就会知道您的关卡对象应该被释放,并且将尽快发布。
@Override
public void onPause(){
super.onPause();
if (isFinishing()){
levelObject = null;
}
}
您需要调用finish()
您不再希望进行的活动(或多个活动)。您可以在开始新活动后立即调用它:
Intent myIntent = new Intent(getBaseContext(), Level3.class);
startActivity(myIntent);
finish();
否则,前一个活动将保留在活动堆栈上。