Android -登录注册实践技术总结

发布于:2025-08-20 ⋅ 阅读:(18) ⋅ 点赞:(0)

一、核心概念和类概览

        这三个类协同工作,共同管理和维护喜马拉雅账号的登录状态、用户信息,并处理与其他平台("Federation")的账号绑定。

XimalayaAccountProvider:

        这是一个 Android ContentProvider 的实现。它的主要作用是作为跨进程通信的桥梁,允许其他应用或模块(特别是 XimalayaAccountManager)安全地访问和操作喜马拉雅账号数据和功能,而无需直接访问底层的 XimalayaAccountRepository。它通过 call() 方法暴露了一系列账号相关的操作,如获取用户信息、刷新 Token、登录、登出等。

XimalayaAccountRepository:

        这是一个数据仓库(Repository)。它的核心职责是处理所有与喜马拉雅账号数据相关的业务逻辑。它不关心数据从哪里来(网络、缓存或本地数据库),只负责获取、处理和存储数据。它封装了与喜马拉雅开放平台 SDK 的交互,例如获取用户信息、检查登录状态、刷新 Token、执行登出操作等。它还负责将账号状态同步到另一个名为 "JDO" 的数据仓库,这可能是另一个平台或服务。

XimalayaFederationDelegate:

        这是一个用于处理“联邦”(Federation)账号绑定的委托类。它实现了 ILoginDelegateILinkDelegate 接口,表明它能够处理登录和绑定相关的请求。这里的“联邦”指的是将喜马拉雅账号与另一个主账号系统(可能是汽车信息娱乐系统或其他平台)进行关联。该类负责在系统启动时尝试使用联邦 Token 自动登录,并处理来自主账号系统的绑定和解绑请求。

二、 登录流程(LoginDelegateXimalayaAccountRepository

        登录流程分为几种情况,但核心都依赖 XimalayaAccountRepository 来执行实际的网络或本地操作。

通过 autoLoginWithFederation() 自动登录

  1. 检查联邦状态: LoginDelegateautoLoginWithFederation() 方法在启动时被调用。它首先通过 CommonDataHelper.getFederationInfo() 获取联邦账号信息。

  2. 验证联邦信息: 它检查获取到的联邦信息是否有效 (isValid())、是否处于绑定状态 (federationStatus.toBoolean()),并且是否包含 Token。

  3. 调用 loginWithFederationToken(): 如果联邦信息有效且包含 Token,它会调用 XimalayaAccountManagerloginWithFederationToken(federationToken) 方法。

  4. 跨进程调用: XimalayaAccountManager 通过 ContentResolver.call() 调用 XimalayaAccountProvider 中的 setFederationTokenAndLogin 方法,并将联邦 Token 作为参数传递。

  5. XimalayaAccountRepository 执行登录: XimalayaAccountProvidercall() 方法接收到请求后,会调用 accountRepository.autoLogin(arg),其中 arg 就是联邦 Token。

  6. 刷新 Token: XimalayaAccountRepositoryautoLogin(refreshToken) 方法首先将联邦 Token 保存为刷新 Token (accountStorage.saveRefreshToken(refreshToken)),然后调用 dataRepository.refreshToken() 去尝试获取新的访问 Token 和用户信息。

  7. 更新状态: 如果 refreshToken() 成功,XimalayaAccountRepository 会调用 updateOnlineUserInfo()syncLoginStatus(true) 来更新本地缓存、LiveData 并同步登录状态到 JDO 平台。

通过 checkLoginResult() 登录(例如,二维码登录)

  1. 获取二维码 Token: 可能是通过 XimalayaAccountManager 调用 getQRCodeToken(),最终由 XimalayaAccountRepositorygetQRCodeToken() 方法调用 dataRepository.generateQrcode()

  2. 检查登录结果: 应用程序会周期性地调用 XimalayaAccountManagercheckLoginResult(token) 方法,来查询用户是否已经通过扫描二维码登录。

  3. 跨进程调用: XimalayaAccountManager 同样通过 ContentResolver.call() 调用 XimalayaAccountProvidercheckLoginResult 方法。

  4. XimalayaAccountRepository 检查: XimalayaAccountProvider 接收到请求后,调用 accountRepository.checkLoginResult(it)

  5. 处理登录结果: XimalayaAccountRepository 调用 dataRepository.checkLoginResult(qrcodeId)。根据返回的 LoginResult,如果 codeLOGIN_SUCCESSWAIT_USERINFO,它会调用 updateUserInfo() 来更新状态,并在登录成功时调用 syncLoginStatus(true)

三、 登出流程

  1. 发起登出: 用户或系统(例如 LoginDelegateonLogOutInvoked() 方法)发起登出请求。

  2. LoginDelegate.onLogOutInvoked(): 这个方法是联邦系统的登出回调。它会通过 ContentResolver.call() 调用 XimalayaAccountProviderlogout 方法。

  3. XimalayaAccountProviderlogout: 该方法调用 accountRepository.logout()

  4. XimalayaAccountRepository 执行登出:

    • 首先,它调用喜马拉雅 SDK 的 AccessTokenManager.getInstanse().loginOut() 来执行 SDK 内部的登出逻辑。

    • 然后,它清除本地存储的 Token (accountStorage.saveToken("", "", 0)) 和用户信息 (accountStorage.saveUserInfo(null))。

    • 最后,它更新 LiveData (updateUserInfo()) 并调用 syncLoginStatus(false) 将登出状态同步到 JDO 平台。

四、 账号绑定/解绑流程

账号绑定和解绑由 LinkDelegate 处理。这个类实现了 ILinkDelegate 接口,用于响应来自联邦主账号系统的绑定/解绑请求。

绑定 (onLinkFederationInvoked)

  1. 收到绑定请求: 当联邦系统发起绑定请求时,LinkDelegateonLinkFederationInvoked() 方法被调用,并传入主账号的 puidpvin

  2. 检查本地登录状态: 该方法首先检查本地喜马拉雅账号是否已登录 (accountManager.getUserInfoValue() != null)。

  3. 同步绑定状态: 如果已登录,它会调用 jdoDataRepository.uploadMediaAccountStatus()。这个方法是关键,它将喜马拉雅账号的登录状态和信息(refreshTokennicknameavatar_url 等)以及联邦系统的 puidpvin 上传到 JDO 平台,从而完成账号的逻辑绑定。

  4. 返回结果: 根据 uploadMediaAccountStatus() 的结果,返回 ResponseBean.SUCCESSResponseBean.obtainFailure()

解绑(onUnlinkFederationInvoked

  1. 收到解绑请求: 当联邦系统发起解绑请求时,LinkDelegateonUnlinkFederationInvoked() 方法被调用。

  2. 同步解绑状态: 它调用 jdoDataRepository.uploadMediaAccountStatus(),但这次将 federationStatus 参数设为 0tokenrefreshToken 设为 null,以通知 JDO 平台喜马拉雅账号与主账号的绑定关系已被解除。

  3. 返回结果: 根据 uploadMediaAccountStatus() 的结果,返回 ResponseBean.SUCCESSResponseBean.obtainFailure()

五、类的相互作用总结

XimalayaAccountRepository:

        负责业务逻辑数据源(网络 API、本地存储)的交互。它不直接与 UI 或其他进程通信,而是通过 LiveData 或返回数据对象的方式。

XimalayaAccountProvider:

        负责跨进程通信。它将 XimalayaAccountRepository 的功能以 ContentProvider 的形式暴露出去,使得其他应用或模块可以通过 ContentResolver.call() 远程调用这些功能。

XimalayaAccountManager:

        作为一个客户端类,它封装了对 XimalayaAccountProviderContentResolver.call() 调用,提供了更友好的 Kotlin suspend 函数接口,供上层业务逻辑(如 LoginDelegate)调用。它也负责通过 ContentObserver 监听 XimalayaAccountProvider 的数据变化。

XimalayaFederationDelegate:

        负责特定场景(联邦绑定)的业务逻辑。它依赖 XimalayaAccountManager 来执行具体的登录、登出和状态同步操作,并实现联邦系统所需的特定接口。


网站公告

今日签到

点亮在社区的每一天
去签到