2011-05-25 99 views
0

我的Android应用程序有一个不活动超时。超时时,我将用户返回到“登录”屏幕,该屏幕始终位于后退堆栈中。我的SignIn类设置了android:launchMode="singleTop",因此在堆栈中运行的实例总是被重用。保持应用程序在后台响应意图

我开始对超时此意图:

Intent inactivityTimeout = new Intent(this, SignIn.class); 
inactivityTimeout.putExtra(INTENT_EXTRA_INACTIVITY_TIMEOUT, true); 
int flags = inactivityTimeout.getFlags(); 
flags = flags|FLAG_FROM_BACKGROUND|Intent.FLAG_ACTIVITY_CLEAR_TOP; 
inactivityTimeout.setFlags(flags); 

当签到屏幕启动时,它会检查INTENT_EXTRA_INACTIVITY_TIMEOUT意向额外费用。如果找到,它会显示“您已被注销”对话框。这一切都正常工作。现在

我去拿的问题:由于它是基于一个计时器,这种意图可以不管,如果我的应用是在前景或背景发射了。这是所希望的,因为我不希望应用程序因为它在后台而无限期地保持登录状态。

但是,当应用程序在后台并且计时器到期时,将关闭此inactivityTimeout Intent并将应用程序带回到前台。现在并不急于提醒用户现在他们已超时,所以我宁愿应用停留在后台以便不中断当前操作。

我尝试添加了FLAG_FROM_BACKGROUND标志,我的意图,但应用程序仍带到前台。我不确定还有什么要尝试的,或者如果这是我应该在我的意图或我的接收活动中处理的问题。

任何人都可以提出一个方法在我的意图来实现这一点(或响应活动?)。或者我在这里错过了一些概念?谢谢!

回答

5

没有必要主动撤销,由于年龄的凭据。毕竟,在用户尝试重用这些凭证之前,该过程可能会终止。

每个活动都需要进行检查,看用户是否有有效凭证。在该检查中,您还要检查年龄,如果证书正确但太旧,则仅凭证书检查失败。而且,在失败的凭证检查中,您将显示您的登录活动。

这允许您转储计时器。

+0

+1更简单(也更符合逻辑)解决方案 – Aleadam 2011-05-25 18:24:07

+0

感谢Mark!这非常有帮助。然而,我愚蠢地忽略了至少一些细节:首先,非活动超时是本地的,并在用户执行任何操作时重置(我使用onUserInteraction())。其次,当应用程序处于前台时发生超时时,我希望Intent在没有任何其他用户交互的情况下触发。这就是计时器派上用场的地方(我在活动改变时重置它,并在onUserInteraction() - 如果它运行到0它将启动意图)。 – Jordan 2011-05-25 19:14:19

+0

无论如何,正如你所建议的,我可以更新凭证的值(如'timeOfLastAction')来跟踪最近的用户操作。不过,我必须定期检查这些凭据是否有效(即不足以触发超时),并显示对话框,如果它们自上次检查以来已变得无效。为了实现这个功能,我必须保留计时器,对吧? – Jordan 2011-05-25 19:14:48

2

你可以有一个全局静态变量来检查应用程序在前台:

public static boolean isForeground = false; 

在每一个活动的onPause设置变量假 在每个活动的onResume设置变量真正

这样你知道该应用程序是否在前台。

当达到超时,如果该活动是在前台,火的意图。 如果不是,请设置全局静态变量true。这个变量将在每个onResume上进行检查,如果它的值为true,它将触发超时意图(这种方式会在您恢复应用程序时触发)。

public static boolean hasTimeout = false; 

如果您有一个BaseActivity实现此功能,那么可以通过所有其他活动扩展此功能。

+1

当您的答案出现时,我即将发布的内容几乎相同。唯一的区别是我在SharedPreferences中考虑一个标志而不是静态字段。 – Aleadam 2011-05-25 18:22:38

相关问题