Android 如何获取最近访问的活动的引用

Android 如何获取最近访问的活动的引用,android,android-activity,Android,Android Activity,我正在创建一个包含多个活动的简单应用程序。我的申请必须根据特定的系统偏好恢复两项活动之一。因此,我实现了一个链接到action.MAIN的Dispatcher类,然后通过检查其onResume()回调中的系统首选项来启动正确的活动 问题 由于我是在onResume()中执行此操作的,因此当按下任何结果活动上的“后退”按钮时,调度程序将恢复,因此它再次尝试再次启动相同的活动。这可以防止用户离开应用程序,除非他们按下home(主页)按钮 一些代码 以下是我的课程中的一些代码摘录,有助于澄清我的情况:

我正在创建一个包含多个活动的简单应用程序。我的申请必须根据特定的系统偏好恢复两项活动之一。因此,我实现了一个链接到
action.MAIN
Dispatcher
类,然后通过检查其
onResume()回调中的系统首选项来启动正确的
活动

问题 由于我是在
onResume()
中执行此操作的,因此当按下任何结果活动上的“后退”按钮时,
调度程序
将恢复,因此它再次尝试再次启动相同的
活动
。这可以防止用户离开应用程序,除非他们按下home(主页)按钮

一些代码 以下是我的课程中的一些代码摘录,有助于澄清我的情况:

Dispatcher.onResume(void):void

一些变量如下所示:

  • manager
    是表示我的类的变量,它与系统首选项交互
  • handled
    是确定事件是否已被处理的变量(请参阅下面的“尝试解决方案1”)
尝试的解决方案#1 我考虑过实现一个布尔类变量,
handled
,在活动开始之前对其进行测试。如果发现该值为
true
,则
调度程序
simple调用
finish()
,但是如果该值为
false
,则启动相应的活动,并将
handled
设置为
true
,以便当应用程序返回到此
活动时,就这样结束了

这行不通,因为

如果用户在其中一个结果活动上按下home按钮,则当用户恢复应用程序时,它们将被置于dispatcher活动上,并且应用程序将立即完成,因为它认为它已被处理(变量仍然为true)

尝试解决方案#2 我试图找到一种方法,在每个应用程序生命周期中只运行一次
调度程序。这是有意义的,因为用户永远不想返回到
调度程序
,因为它是一个
活动
,在启动时只应运行一次。因此,我包含了一个计数器,每次调用onResume()时它都会递增,每次调用finish()时它都会减为0

这行不通,因为

同样,如果用户按下home按钮,则当应用程序重新启动时,
调度程序将认为它已经运行过一次(因为没有调用
finish()
),并将立即再次完成

尝试解决方案#3 我想,如果我能够以某种方式确定之前激活的活动,那么我可以动态地对用户按下后退按钮的情况做出反应,然后并且只有在随后通知调度程序它应该完成,那么当用户按下主页按钮时,就不会立即完成

这是通过使用一个静态函数
returningFromMenu()
来实现的,当从菜单
活动
调用该函数时,会在
Dispatcher
类中升起一个标志,通知it完成

尝试的解决方案#4(当前实施) 只需将所有这些活动切换代码移动到onCreate()。这将强制执行
调度程序的“一次性”特性

这可能有用,因为

这将处理用户返回活动(使用onResume())的情况,并且由于没有标志,因此在按下home按钮后返回应用程序时没有问题


我的问题 除了必须使用静态方法或成员之外,还有什么方法可以确定最后完成了哪个
活动
?我知道这是一种非常糟糕的做法,如果可能的话,我希望避免这种做法

更新 最后更新:美国东部时间2013年2月12日下午3:45

方法#4似乎符合我的目的,但我仍然认为这里的问题对开发人员非常有用,在我有足够的时间发布更全面的解决方案之前,我不会回答我的问题。

解决方案 正如上面“更新”中所述,只需将代码移动到
onCreate()
中,就可以解决此问题,从而只进行一次切换。同样,我可以在启动活动后立即调用
finish()
,以便从后堆栈中删除调用活动


感谢大家在评论部分所做的努力

也许我没有看到什么,但是为什么你不能在
startActivity(activity\u switcher)之后立即调用
finish()
?当然,您的
onCreate()
方法也很好。另一种方法是去掉
Dispatcher
,并在游戏菜单活动的
onCreate()
中执行调度。这样,如果检测到它,它将跳转到一个活动的游戏中,但“后退”按钮将返回菜单(对我来说,这似乎是预期的“典型”行为)。我不知道,在你开始一项活动后,你还可以做任何其他事情。为了澄清这一点,我认为当您开始一项活动时,系统会立即执行代码并停止执行原始活动代码。以这种方式调用finish()会从后堆栈中删除活动吗?如果是这样,那么这将是一个非常有见地的解决我的问题的办法。此外,我有调度员的原因是处理游戏突然停止的任何情况。在这种情况下,你永远不会想回到菜单,而是直接回到游戏。我没有尝试过这种方式,但似乎表明它会起作用。我相信
protected void onResume() {

    super.onResume();

    if(!handled){

        Intent activity_switcher;

        //If a game is active...
        if(manager.isGameActive()){

            //Start the the Game Manager with the appropriate game.
            activity_switcher = new Intent(this, GameManager.class);
        }
        //If a game is not active... 
        else{

            //Start the Game Menu
            activity_switcher = new Intent(this, Menu.class);
        }

        //Start the appropriate activity
        startActivity(activity_switcher);
        overridePendingTransition(0, 0);
    }
    else{

        //Finish the application
        finish();
        overridePendingTransition(0, 0);
    }
}