1

我目前正在构建一个需要身份验证的 ICS 4.0+ Android 应用程序。我遇到的问题是在以下情况下处理登录状态检查:

  • 用户首次打开应用
  • 用户关闭(恢复)后返回应用

我正在寻找的行为是,如果应用程序从内存中删除并重新打开,则会出现“正在加载...”启动画面,然后当用户在恢复时返回应用程序时(仍在内存中),会出现几乎不明显的启动画面.

我目前用于检查的代码是:

    public static void checkUserStatus(Context context, boolean isPassive) {
    Log.d(TAG, "Checking user status..");
    // User is logged in and has cc
    if ( APIUtil.isLoggedIn() && UserAccount.getCreditCards().size() > 0 && isPassive == false) {
        Intent intent = new Intent(context, OtherActivity.class);
        context.startActivity(intent);
    // User is logged in but has no cc
    } else if (APIUtil.isLoggedIn() && UserAccount.getCreditCards().size() == 0) {
        Intent intent = new Intent(context, ManageCCActivity.class);
        context.startActivity(intent);
    // User is not logged in
    } else if(isPassive == false) {
        Intent intent = new Intent(context, HomeActivity.class);
        context.startActivity(intent);
    }
}

在每个活动的 onResume() 中调用 checkUserStatus。这个想法是它会检查并相应地重定向,但行为古怪且不一致,而且感觉很笨拙。

那里有身份验证流程的示例吗?想法?建议?

4

2 回答 2

2

我已经使用并看到其他效果很好的模式看起来像这样:

  • 将您用于确定用户是否已登录并具有有效数据的逻辑封装到 aService中,然后运行该Service绑定(这意味着您永远不会启动或停止它,而是绑定到它...文档链接以获取更多信息)。
  • 实现一个基本Activity实现,该实现绑定到 in 中的服务onStart()并从 .in 中解除绑定onStop()。这允许Service您在从一个移动Activity到另一个时保持运行。让任何Activity需要访问此信息的人都继承自此基础(可能是 every Activity)。
  • Service在启动时检查所需的信息,然后用结果回电。

这会创建一个(相当)单一的授权检查实例,仅在应用程序启动或用户离开后返回时进行检查,而不会在您从一个移动Activity到另一个时不断检查。它还允许它在用户过早离开时优雅地完成任何长时间运行的操作,因为所有工作都在Service.

于 2012-11-21T18:36:37.893 回答
1

这就是我现在正在开发的应用程序上所做的事情。

1) StartUpActivity:检查用户是否登录。根据用户状态重定向到登录屏幕或主屏幕。如果用户保存了它的凭据并且需要某种 api 令牌或会话,您可能希望添加静默登录。

2)在我的应用程序中,用户必须登录,因为它正在访问一些受保护的资源。如果由于无效的 api 令牌或不正确的登录信息而无法访问资源,则从 API/网络级别广播意图(通常匹配 http 代码 401 或 403 )

3) BroadcastReceiver 捕获该特定意图,注销用户,并使用消息将应用重定向到登录屏幕。

这样,您的 UI 就不必检查用户状态,只需准备好在用户未经授权时将其移出屏幕即可。

值得一提的是,我的应用确实经常使用网络,因为它是一个近乎实时的应用。正因为如此,我能够相当快地捕捉到未经授权的事件。

于 2012-11-21T18:18:07.237 回答