我正在创建一个需要多个活动的简单应用程序。我的应用程序有必要根据某个系统偏好恢复两个活动之一。因此,我实现了一个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
,则Dispatcher
simple 调用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 似乎对我的目的有效,但是我仍然认为这里的问题可能对开发人员很有用,并且在我有足够的时间发布更全面的解决方案之前,我不会回答我的问题。