2

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

问题

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

一些代码

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

Dispatcher.onResume(void) : 无效

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

一些变量如下:

  • manager是代表我的类与系统首选项接口的变量。
  • handled是确定事件是否已被处理的变量(请参阅下面的“尝试的解决方案 #1”)

尝试的解决方案#1

我考虑过实现一个布尔类变量 ,handled在活动开始之前对其进行测试。如果发现值为true,则Dispatchersimple 调用finish(),但如果值为false,则启动适当的活动并将handled其设置为,true以便当应用程序返回 thisActivity时,它将简单地完成。

这行不通,因为...

如果用户在结果活动之一上按下主页按钮,那么当他们恢复应用程序时,它们将被放置在调度程序活动上,并且应用程序将立即完成,因为它认为它已被处理(变量仍然为真) .

尝试的解决方案#2

我试图找到某种方法,让Dispatcher每个应用程序生命周期只运行一次。这是有道理的,因为用户永远不会想要返回到它,Dispatcher因为它Activity应该只在启动时运行一次。因此,我包含了一个计数器,每次调用 onResume() 时都会递增,每次调用 finish() 时都会减少到 0。

这行不通,因为...

同样,如果用户按下主页按钮,那么当应用程序重新启动时,Dispatcher认为它已经运行过一次(因为没有调用finish()),并且会立即再次运行。

尝试的解决方案#3

我想如果我能以某种方式确定哪个活动以前是活动的,那么我可以动态地对用户按下后退按钮的情况做出反应,然后通知Dispatcher它应该完成,那么就不会立即完成用户按下主页按钮的情况。

这是通过使用一个静态函数来完成的returningFromMenu(),当从 menu 调用该函数时Activity,会在类中引发一个标志Dispatcher,通知它完成。

尝试的解决方案 #4(当前实施)

只需将所有这些活动切换代码移动到 onCreate() 中。这将强制执行Dispatcher.

这可能会奏效,因为...

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


我的问题

Activity除了必须使用静态方法或成员之外,还有什么方法可以确定最后完成的?我知道这是一种非常糟糕的做法,如果可能的话,我想避免它。

更新

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

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

4

1 回答 1

0

解决方案

正如上面“更新”中所述,只需将代码移入即可解决此问题,onCreate()以便只进行一次切换。等效地,我可以简单地finish()在启动活动后立即进行调用,以便从后台堆栈中删除调用活动。

感谢大家在评论区的努力!

于 2013-02-15T20:31:31.190 回答