【问题标题】:Resuming activity from another activity从另一个活动恢复活动
【发布时间】:2013-11-26 14:48:56
【问题描述】:

我有带有“新游戏”和“恢复”按钮的 MenuActivity。 “新游戏”启动 FireRoomActivity。

public void newGame(View view){
        Intent intent = new Intent(this, FireRoomActivity.class);
        this.finish();  
        startActivity(intent);
    }

在 FireRoomActivity 中,onBackPressed 被覆盖以返回到 MenuActivity。

@Override
public void onBackPressed() {
    super.onBackPressed();
    Intent inMain=new Intent(this, MenuActivity.class);
    startActivity(inMain);
}

MenuActivity 中的“恢复”按钮应该恢复 FireRoomActivity。但这只是退出应用程序。

public void resume(View view){
    this.finish();
}

Q1) 我做错了什么?

Q2) 如果我添加第三个活动“ThreeActivity”并从 FireRoomActivity(finishing FireRoomActivity) 启动它,并在这个“ThreeActivity”覆盖 onBackPressed 转到 MenuActivity,我会怎么做?

我是android生命周期的新手,希望能详细回答

【问题讨论】:

  • Activity会遵循自己的生命周期,所以不能直接调用onResume。来自其他activity时会先调用onRestart,再调用其他方法

标签: android android-lifecycle activity-stack


【解决方案1】:

1) 你在搞乱自然秩序。无需在“新游戏”方法中调用“完成”。

只需将 Activity 留在堆栈上,这样当您按下返回键时,您就可以返回到它。然后,当按下返回键时,您不需要启动新活动,因为您已经返回到您已经拥有的一个 MenuActivity。

您的 resume 方法正在调用完成并因此关闭菜单。不要“完成”菜单,而是输入代码以恢复游戏。

2) 了解活动生命周期。一旦你理解了这一点,你就会更好地处理这个问题。如果您要返回一项活动,则无需在开始另一项活动时完成该活动。把它们想象成一堆。您将活动放在堆栈上,然后返回按钮将它们再次弹出。只有当你完全完成一项活动并且再也不想看到它时,你才会完成它。

【讨论】:

  • 我有点困惑。如果我不在 MenuActivity 中调用完成,FireRoomActivity 将在堆栈的最前面: **** FireRoomActivity, MenuActivity **** 然后,当用户在 FireRoomActivity 并按下返回按钮时,FireRoomActivity 需要完成后才能让MenuActivity 出栈。然后,当点击恢复按钮时,我需要恢复 FireRoomActivity,我该怎么做?
  • 您无法恢复已完成的活动。启动一个新的 FireRoomActivity,但包括告诉它从您保存的状态恢复的 Extras。保持你的堆栈简单。如果您以您尝试的方式操作它,您将遇到各种各样的问题。最重要的是,学习活动生命周期。如果你理解它,你就不会遇到这些问题。
  • 如果您尽量不将您的活动视为永久的游戏屏幕,这可能会有所帮助。它们是用户交互的游戏窗口。您应该能够根据请求(例如当用户暂停时)保存所有游戏状态,重新启动设备,但仍以用户离开时的相同状态重新启动游戏活动。
  • 是的,我没有完全理解后栈,这就是我问的原因。我试图避免在这种情况下保存游戏状态。不过谢谢,你的一些建议对我有帮助。对此表示赞同
  • 您需要能够保存游戏状态。如果用户在玩您的游戏并在同一台设备上接听电话,他们将失去进度。
【解决方案2】:
**Try This**
======================
public void onBackPressed() {
Intent i = new Intent(getApplicationContext(), MenuActivity.class);
            i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            i.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
            startActivity(i);
            finish();
}

【讨论】:

    【解决方案3】:

    试试:

    @Override
    public void onBackPressed() {
        Intent inMain=new Intent(this, MenuActivity.class);
        startActivity(inMain);
    }  
    

    onBackPressed() 本身完成活动。在这种情况下,如果您在 FireRoomActivity 中按下“返回”按钮,它将始终暂停。所以如果你想完成它,你需要调用finish();

    【讨论】:

      【解决方案4】:

      删除 onBackPressed 重写方法中的 super.OnBackPressed()

      如果它不起作用,试试这个:

      使用单击恢复按钮的语法启动 FireRoomActivity

      Intent i = new Intent(getActivity(), FireRoomActivity.class);
      i.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT)
      startActivity(i);
      

      【讨论】:

        【解决方案5】:

        在您的 ThreeActivity 中覆盖它

        @Override
        public void onBackPressed() {
            Intent intent=new Intent(this, MenuActivity.class);
            startActivity(intent);
        }
        

        更多信息请参考this链接

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多