【问题标题】:Keep application in background in response to an Intent将应用程序保持在后台以响应 Intent
【发布时间】:2011-09-01 23:50:02
【问题描述】:

我的 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 Intent extra。如果找到,它会显示“您已退出”对话框。这一切正常。

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

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

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

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

【问题讨论】:

    标签: android background timeout android-intent


    【解决方案1】:

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

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

    这允许您转储计时器。

    【讨论】:

    • 谢谢马克!这很有帮助。但是,我愚蠢地忽略了至少几个细节:首先,不活动超时是本地的,并且在用户执行任何操作时都会重置(我为此使用 onUserInteraction() )。其次,当应用程序处于前台时发生超时时,我希望在没有任何进一步用户交互的情况下触发 Intent。这就是计时器派上用场的地方(我在活动更改和 onUserInteraction() 时重置它 - 如果它运行到 0,它将启动 Intent)。
    • 无论如何,正如您所建议的,我可以更新凭据上的值(例如timeOfLastAction)以跟踪最近的用户操作。尽管如此,我还是必须定期检查这些凭据是否有效(即,年龄不足以触发超时),并在自上次检查后它们变得无效时显示对话框。为了实现这个功能,我必须保留计时器,对吧?
    • @Jordan:只需检查onResume() 中的凭据是否良好/陈旧,因为您已经在那里更新您的timeOfLastAction。如果您真的很偏执,还请检查 onPrepareOptionsMenu() 等位置的凭据。
    【解决方案2】:

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

    public static boolean isForeground = false;
    

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

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

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

    public static boolean hasTimeout = false;
    

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

    【讨论】:

    • 当你的答案出现时,我正要发布几乎相同的内容。唯一的区别是我在 SharedPreferences 中考虑一个标志而不是静态字段。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多