2

我正在开发一个多关卡游戏,每个关卡都是一项新活动。

我想知道,如果我改变活动,比如

Intent myIntent = new Intent(getBaseContext(), Level3.class);
                startActivity(myIntent);

Level 1 和 2 使用的内存被清除了?

如果没有,我怎样才能清除上一级活动中的所有内容,以便手机仅将内存用于当前活动?

4

3 回答 3

0

我不建议您为每个游戏级别创建活动。最好创建一些控制器来在一个活动中初始化你的游戏关卡。当然,它必须有一些方法来清除最后阶段的内存,如下所示:

    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();

最好的祝愿。

于 2013-06-23T09:04:07.937 回答
0

由于您使用的是活动/关卡设计,因此只需在 onPause 方法中添加检查您的活动是否正在完成,并将您对当前关卡的所有引用清空,这样 GC 就会知道您的关卡对象应该被释放,并且将尽快发布。

@Override
public void onPause(){
      super.onPause();
      if (isFinishing()){
         levelObject = null;
}

}

于 2013-06-23T08:46:39.983 回答
0

您需要调用finish()您不再希望进行的活动(或多个活动)。您可以在开始新活动后立即调用它:

Intent myIntent = new Intent(getBaseContext(), Level3.class);
startActivity(myIntent);
finish();

否则,前一个活动将保留在活动堆栈上。

于 2013-06-23T08:42:41.530 回答