将应用程序保留在后台以响应Intent

时间:2011-05-25 17:58:54

标签: android background timeout android-intent

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

我在超时时开始这个意图:

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

当SignIn屏幕启动时,它会检查INTENT_EXTRA_INACTIVITY_TIMEOUT Intent extra。如果找到,则显示“您已签名”对话框。这一切都正常。

现在我将解决这个问题:由于它基于一个计时器,无论我的应用程序是在前台还是后台,都可以触发此Intent。这是理想的,因为我不希望应用程序无限期地保持登录状态,因为它位于后台。

但是,当应用程序在后台并且计时器到期时,将触发此inactivetivityTimeout Intent并将应用程序带回前台。现在提醒用户 他们已经超时并不紧急,所以我希望应用程序保留在后台,以免中断当前操作。

我尝试将FLAG_FROM_BACKGROUND标志添加到我的Intent中,但应用程序仍然处于前台。我不确定还有什么可以尝试,或者这是我应该在我的意图或接收活动中解决的问题。

有人可以建议在我的Intent(或响应活动中)实现此方法吗?或者我在这里遗漏了一些概念?谢谢!

2 个答案:

答案 0 :(得分:5)

由于年龄原因,无需主动撤销凭据。毕竟,在用户尝试重用这些凭证之前,该过程可能会终止。

每个活动都需要检查用户是否拥有有效凭据。在该检查中,您还检查年龄,如果凭据正确但太旧,则无法通过凭据检查。并且,在失败的凭据检查中,您将调出登录活动。

这允许您转储计时器。

答案 1 :(得分:2)

您可以使用全局静态变量来检查应用程序是否位于前台:

public static boolean isForeground = false;

在每个活动onPause上设置变量false 在每个活动onResume上设置变量true

这样您就知道应用程序是否在前台。

当达到超时时,如果活动在前台,则触发意图。 如果不是,请将全局静态变量设置为true。这个变量将在每个onResume上检查,如果它是真的,它将触发超时意图(这样当你恢复应用程序时它会被触发)。

public static boolean hasTimeout = false;

如果你有一个实现它的BaseActivity,这将更容易,所有其他活动都会扩展它。