Android 将应用程序保留在后台以响应意图

Android 将应用程序保留在后台以响应意图,android,background,timeout,android-intent,Android,Background,Timeout,Android Intent,我的Android应用程序有一个非活动超时。在超时时,我将用户返回到“登录”屏幕,该屏幕(始终)位于后堆栈中。我的SignIn类设置了android:launchMode=“singleTop”以便始终重用后台运行的实例 我在超时时启动此意图: Intent inactivityTimeout = new Intent(this, SignIn.class); inactivityTimeout.putExtra(INTENT_EXTRA_INACTIVITY_TIMEOUT, true); i

我的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\u EXTRA\u INACTIVITY\u TIMEOUT
INTENT EXTRA。如果找到,将显示“您已注销”对话框。这一切都正常工作

现在我要解决这个问题:因为它是基于计时器的,所以不管我的应用程序是在前台还是后台,这个意图都会被激发出来。这是我想要的,因为我不希望应用程序因为在后台而无限期地保持登录状态

但是,当应用程序位于后台且计时器过期时,此inactivityTimeout意图将被触发,应用程序将返回前台。现在提醒用户他们已经超时并不紧急,所以我希望应用程序留在后台,以免中断当前操作

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


有人能在我的意图中(或在响应活动中)建议一种实现这一点的方法吗。还是我遗漏了一些概念性的东西?谢谢

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

public static boolean isForeground = false;
在每个活动onPause上,将变量设置为false 在每个活动onResume上设置变量true

这样你就能知道应用程序是否在前台

当达到超时时,如果活动位于前台,则触发意图。 如果不是,则将全局静态变量设置为true。此变量将在每次onResume时进行检查,如果为true,则将触发超时意图(这样,当您恢复应用程序时,将触发超时意图)


如果您有一个实现此功能的BaseActivity,并且该功能由所有其他活动扩展,则此功能将更容易实现。

无需由于使用时间过长而主动撤销凭据。毕竟,这个过程很可能在用户尝试重用这些凭证之前终止

每个活动都需要检查用户是否具有有效凭据。在该检查中,您还检查了年龄,如果凭证正确但太旧,那么凭证检查就会失败。并且,当凭证检查失败时,您将启动登录活动


这允许您转储计时器。

当您的答案出现时,我正要发布几乎相同的内容。唯一的区别是我想在SharedReferences中使用一个标志,而不是静态字段。谢谢Mark!这很有帮助。然而,我愚蠢地遗漏了至少两个细节:首先,非活动超时是本地的,并且在用户执行任何操作时都会重置(我使用onUserInteraction()来实现这一点)。其次,当应用程序处于前台时超时,我希望在没有任何进一步用户交互的情况下启动。这就是计时器派上用场的地方(当活动发生变化时,我会重置它,并且onUserInteraction()-如果它运行到0,它将启动Intent)。无论如何,正如您所建议的,我可以更新凭据上的值(例如
TimeOfLaAction
)来跟踪最新的用户操作。尽管如此,我还是必须定期检查这些凭证是否有效(即,没有足够的时间触发超时),并显示自上次检查以来这些凭证是否无效的对话框。为了实现此功能,我必须保留计时器,对吗?@Jordan:只需检查
onResume()
中的凭据是否良好/过时,因为您已经在那里更新了
timeoflastation
。如果你真的有妄想症,也可以在
onPrepareOptionsMenu()
等位置检查凭据。
public static boolean hasTimeout = false;