我的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(或响应活动中)实现此方法吗?或者我在这里遗漏了一些概念?谢谢!
答案 0 :(得分:5)
由于年龄原因,无需主动撤销凭据。毕竟,在用户尝试重用这些凭证之前,该过程可能会终止。
每个活动都需要检查用户是否拥有有效凭据。在该检查中,您还检查年龄,如果凭据正确但太旧,则无法通过凭据检查。并且,在失败的凭据检查中,您将调出登录活动。
这允许您转储计时器。
答案 1 :(得分:2)
您可以使用全局静态变量来检查应用程序是否位于前台:
public static boolean isForeground = false;
在每个活动onPause上设置变量false 在每个活动onResume上设置变量true
这样您就知道应用程序是否在前台。
当达到超时时,如果活动在前台,则触发意图。 如果不是,请将全局静态变量设置为true。这个变量将在每个onResume上检查,如果它是真的,它将触发超时意图(这样当你恢复应用程序时它会被触发)。
public static boolean hasTimeout = false;
如果你有一个实现它的BaseActivity,这将更容易,所有其他活动都会扩展它。