我已经在我的应用程序中集成了 android 的帐户管理,我可以从Accounts & Sync
设置中管理帐户。
我想要经典的登录活动,在成功登录时将用户转发到他的家庭活动,并可以选择记住用户的密码。但是,AccountAuthenticatorActivity
必须将其结果AccountManager
与凭据和其余帐户信息一起返回给,调用显式finish()
并返回意图。
如何在AccountManager
无需finish()
登录活动的情况下提供所需的信息?
我已经在我的应用程序中集成了 android 的帐户管理,我可以从Accounts & Sync
设置中管理帐户。
我想要经典的登录活动,在成功登录时将用户转发到他的家庭活动,并可以选择记住用户的密码。但是,AccountAuthenticatorActivity
必须将其结果AccountManager
与凭据和其余帐户信息一起返回给,调用显式finish()
并返回意图。
如何在AccountManager
无需finish()
登录活动的情况下提供所需的信息?
AccountManager 不打算由交互式应用程序调用,而是由 Sync Adapter 调用。(一个很棒的教程是“你赢了吗?»编写一个 Android 同步提供程序”第 1部分和第 2部分提供了很好的代码示例,但没有很好地解释数据流。)就像这样:
您开发了一个包装数据库的 ContentProvider。您构建一个 SyncAdapter(这是一个后台服务)来连接到服务器并获取数据并同步 ContentProvider 以匹配服务器。然后,您的 UI 查询 ContentProvider 以显示获取的数据。还有一些方法可以直接查询特定信息,例如,如果您想搜索和缓存结果。有关数据模型的外观,请参阅开发 RESTful Android 应用程序以进行长达一小时的精彩会议。他们给出了三个架构示例,从“幼稚”的实现开始,然后发展到正确的 SyncAdapter 模型。
至于身份验证本身,SyncAdapter 使用 AccountManager 的方式是获取身份验证令牌。这是一个(通常)很大的十六进制值,作为 HTML 标头的一部分传递,而不是用户名/密码对。将其视为一个会话的唯一密钥。拥有密钥是身份验证的证明,它们会定期过期。当它们过期时,您重新验证并获取一个新的。SyncAdapter 向 AccountManager 询问特定帐户类型/用户名组合的身份验证令牌。AccountManager 与服务器进行身份验证(如果需要更改密码,则要求用户输入新密码)并将令牌返回给 SyncAdapter,后者从那时起使用它。
如果此模型不适合您的应用程序,则需要在您的应用程序代码中手动处理登录/注销。有点痛,我知道。
@jcwenger 这并不完全正确。您也可以AccountManager
从交互式应用程序中使用。例如,您可以使用AccountManager
'addAccountExplicitly()
方法在不调用帐户管理器接口的情况下添加帐户。
关于“你赢了吗?” 文章可以清楚地看到,账户管理器是从应用程序自己调用的Activity
。如果应用程序有自己的帐户管理界面,这很有用。
我使用 AccountManager 的“经典流程”版本:
我将我的 AuthenticatorActivity 用于通过它使用的正常情况。帐户和同步设置,但我也将其打开以供依赖相同帐户的应用程序使用。我有一个单独的 apk,其中实现了 Authenticator 和依赖这些帐户的其他应用程序(单独的 apk)。
处理的案件:
正常情况:用户通过添加/验证。Accounts & Sync(根据 Android 示例项目)
处理来自外部应用程序的身份验证请求:如何?我在 Authenticator 应用程序的清单中提供了一个意图过滤器,以便其他应用程序可以通过实例化 AuthenticatorActivity。startActivityForResult(他们必须包含一个额外的意图,表明他们是谁(他们的应用程序包))。在 AuthenticatorActivity 中,我检测到这种情况,并在身份验证过程结束时避免调用 setAccountAuthenticatorResult,因为我保留了它用于上述正常情况。用户输入他们的凭据并按登录:检查 AccountManger 是否匹配帐户,如果匹配,我将该帐户的用户名保留为调用应用程序包的活动用户。然后我通过将意图返回给调用应用程序。setResult 表示成功,用户名和帐户类型。
希望这可以帮助某人。