【问题标题】:Finish old instance of activity and start new instance of the same activity完成旧的活动实例并启动相同活动的新实例
【发布时间】:2013-12-02 11:24:44
【问题描述】:

我的 MenuActivity 有两个按钮“New Game”和“Resume”,分别带有 onClick 方法 newGame() 和 resume()

  • newGame() 方法启动 GameActivity 并完成 MenuActivity。

  • resume() 方法。当 resume() 时,MenuActivity 会自行完成并生效 将自动恢复 GameActivity。因为它将在后堆栈中。为什么它会在后栈中?在 GameActivity 中,onBackPressed 方法会启动 MenuActivity,但不会自行完成,因此会留在后台堆栈中。

 public class MenuActivity extends Activity{
    ...
    public void newGame(View view){
      Intent intent = new Intent(this,GameActivity.class);
      intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
      startActivity(intent);
      this.finish();  
  }
      public void resume(View view){
      this.finish();
  }
}
public class GameActivity extends Activity{
...
    @Override
      public void onBackPressed() {
        Intent inMain=new Intent(this, MenuActivity.class);
        startActivityForResult(inMain, 0);
    }}

场景如下:按下新的游戏按钮,即 MenuActivity 完成,GameActivity 启动。在游戏中的某个时刻,用户按下后退按钮,它将启动 MenuActivity。在 MenuActivity 中,用户再次按下新游戏按钮。它应该完全完成 GameActivity 的旧实例并释放它所持有的所有内存并从头开始新实例。但是现在当新游戏开始时,旧版本仍在内存中,我可以从 DDMS 分配的内存中看到它。我怎样才能达到我所描述的理想效果?

【问题讨论】:

  • 在 MenuActivity 中,您正在启动 FireRoomActivity,而不是您描述的 GameActivity。
  • 好的,谢谢。我忘记改名字了。但这不是问题
  • 请出示您的清单。

标签: android activity-lifecycle activity-stack


【解决方案1】:

如果您想从您的MenuActivity 开始一个新的GameActivity,那么只需让MenuActivity 将一个特殊的结果代码返回给GameActivity。在GameActivity.onActivityResult()如果返回特殊结果码,你应该像这样开始一个新的GameActivity

Intent intent = new Intent(this, GameActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
finish();

【讨论】:

  • 你的意思是在 MenuActivity.newGame(){ setResult(RESULT_CLOSE_ALL); this.finish(); } 并在 GameActivity.onActivityResult(){ switch(resultCode) { case RESULT_CLOSE_ALL: Intent intent = new Intent(this, GameActivity.class);意图.addFlags(意图.FLAG_ACTIVITY_CLEAR_TOP);开始活动(意图);完成();} ???
  • 但这会在我第一次启动游戏时关闭我的应用程序,因为 backstack 中没有任何内容
  • 我不这么认为。它再次启动GameActivity
【解决方案2】:
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

if (requestCode == 1) {

 if(resultCode == RESULT_OK){      
     String result=data.getStringExtra("result");      
     //Check the result if it is resume just continue
     // else
     /* What about starting the activity from here itself */
     Intent intent = getIntent();
     finish();
     startActivity(intent);
 }
 if (resultCode == RESULT_CANCELED) {    
     //Write your code if there's no result
 }
 }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多