处理登录并使用AccountManager记住我

时间:2011-03-14 15:39:22

标签: android accountmanager

我已在我的应用程序中集成了Android的帐户管理功能,我可以使用Accounts & Sync设置管理帐户。

我想拥有经典的登录活动,可以在成功登录时将用户转发到他的家庭活动,并可以选择记住用户的密码。但是,AccountAuthenticatorActivity必须使用凭据和其他帐户信息将结果返回给AccountManager,调用显式finish()并返回意图。

如何在不必AccountManager登录活动的情况下为finish()提供所需的信息?

3 个答案:

答案 0 :(得分:20)

AccountManager不是由交互式应用程序调用,而是由同步适配器调用。 (一个很好的教程是“你赢了吗?”编写一个Android同步提供程序“Part 1Part 2,它提供了很好的代码示例,但没有解释数据流。”就像这样:

您开发了一个包装数据库的ContentProvider。您构建一个SyncAdapter(这是一个后台服务)来连接到服务器并获取数据并同步ContentProvider以匹配服务器。然后,您的UI查询ContentProvider以显示提取的数据。如果要搜索和缓存结果,还有一些方法可以直接查询特定信息。有关数据模型外观的详细信息,请参阅Developing RESTful Android Apps。他们提供了三个架构示例,从“天真”实现开始,然后进入适当的SyncAdapter模型。

对于身份验证本身,SyncAdapter使用AccountManager的方式是获取身份验证令牌。这是一个(通常)一个大的十六进制值,它作为HTML标题的一部分传递,而不是用户名/密码对。将其视为一个会话的唯一密钥。密钥的保留是身份验证的证明,它们会定期到期。当它们到期时,您将重新进行身份验证并获取一个新的。 SyncAdapater向AccountManager请求特定帐户类型/用户名组合的身份验证令牌。 AccountManager使用服务器进行身份验证(如果需要,可以通过更改请求用户输入新密码)并将令牌返回给SyncAdapter,然后再使用它。

如果此模型不适合您的应用程序,则需要在应用程序代码中手动处理登录/注销。有点痛,我知道。

答案 1 :(得分:11)

@jcwenger这不完全正确。您也可以使用交互式应用程序中的AccountManager。例如,您可以使用AccountManager的{​​{1}}方法在不调用客户经理界面的情况下添加帐户。

关于“你赢了吗?”文章您可以清楚地看到从应用程序自己的addAccountExplicitly()调用帐户管理器。如果应用程序有自己的帐户管理界面,这很有用。

答案 2 :(得分:1)

我使用AccountManager的'经典流'版本:

我将AuthenticatorActivity用于正常使用的情况。账户&同步设置,但我也将其打开以供依赖于相同帐户的应用程序使用。 我有一个单独的apk实现了Authenticator,其他应用程序(单独的apks)依赖于这些帐户。

案件处理:

  • 正常情况:用户通过添加/验证。账户&同步(根据Android示例项目)

  • 处理来自外部应用的身份验证请求: 怎么样?我在Authenticator应用程序的Manifest中提供了一个intent过滤器,以便其他应用程序可以通过实例化AuthenticatorActivity。 startActivityForResult(它们必须包含一个额外的意图,表明它们是谁(他们的应用程序包))。在AuthenticatorActivity中,我检测到这种情况,并且在身份验证过程结束时不要调用setAccountAuthenticatorResult,因为我保留了它用于上面的正常情况。用户输入他们的凭据并按下登录:帐户管理员检查匹配的帐户,如果匹配我 将该帐户的用户名保留为调用应用程序包的活动用户。然后我通过调用app返回一个意图。 setResult表示成功,用户名和帐户类型。在帐户不存在的情况下,我会经历正常情况下的过程,即调用addAccountExplicitly然后设置活动用户,然后调用setResult并完成。

希望这有助于某人。