阅读主题
Android 生命周期与线程
适用版本:v0.2.1。前置为 Activity 已持有 SDK 成员字段并完成 授权交换。源码具有会话/界面 generation 和迟到响应保护;设备上的旋转、进程恢复与引擎冲突仍待验证。
推荐:每个 Activity 独立 SDK
java
private StarlightSdk sdk;
@Override protected void onDestroy() {
if (sdk != null) sdk.destroy();
sdk = null;
// 若采用授权页的外部网络线程:gameIo.shutdownNow();
super.onDestroy();
}新 Activity 创建新 SDK 并重新登录,或调用 restoreSession(saved, callback) 显式验证宿主加密保存的 envelope。SDK 不写 SharedPreferences,不自动恢复;exportSession() 仅导出带 appId/API origin 的副本,恢复时先请求 /api/me,成功前不公开身份。旋转或进程回收后不能假设自动登录;不得伪造 Authorization 或直接导入裸 token。
SDK 构造时的 Listener 是 final。如果 Listener 是 Activity,把 SDK 放在单例中会间接保留旧 Activity。
detach 与 destroy 的区别
| 方法 | 实际行为 | 不包含的行为 |
|---|---|---|
hideFloat() | 移除宿主中的浮球 | 不退出账号,不销毁实例 |
detachActivity() | 递增界面/会话 generation,取消待登录事务,移除浮球并关闭对话框 | 不清除内存 token,不释放/替换构造 Listener,不关线程 |
logout() | 尝试撤销平台会话,立即清本地 token/快照/待授权并关闭对话框,调用 onLogout | 网络失败不保证远端已撤销;不自动清游戏自己的会话 |
destroy() | 标记销毁、detach、清内存会话、关闭 SDK 线程并清 Handler 回调 | 不把 final Listener 置空,也不保证服务端 token 已撤销 |
调用 destroy() 后同时释放外部持有的 SDK 引用。它不保证调用 onLogout(),因此 Activity 的资源清理不能只依赖 onLogout 回调。业务主动退出时用 logout() 并清理宿主状态;不要在退出后立即销毁就假定网络撤销已完成。
如果业务必须跨 Activity 保留会话,需要另行设计不强引用 Activity 的宿主路由监听器、旧宿主解除绑定和新宿主绑定策略,并实际测试。v0.2.1 没有公开 listener 重绑定 API,不能把 detach 当作该能力。
线程与迟到结果
涉及 UI 的方法由主线程调用。SDK 自身网络在内部执行器执行并通过主线程 Handler 分发回调;宿主游戏后端请求仍需自行调度,网络不得阻塞主线程。
java
final StarlightSdk owner = sdk;
// 在发起外部异步授权交换时捕获 owner 和原 authorization。
// 回到主线程取得 responseJson 后:
if (owner != null && sdk == owner && !isFinishing() && !isDestroyed()) {
owner.completeGameLogin(authorization, responseJson);
}此片段位于已取得 authorization/responseJson 的回调内。完整可用请求示例见 授权交换。SDK 的事务检查保护自身身份;宿主的结果缓存、角色连接和页面状态也必须检查请求归属。
可观察的验收结果
- 登录中按返回、旋转或销毁 Activity,旧响应到达后不进入游戏、不再打开旧对话框。
- 连续登录两个账号时,只显示最新会话;旧页面不保留订单、钱包、聊天或角色资料。
- 隐藏浮球再显示只出现一个浮球;离开 Activity 后没有 Window 泄漏和悬挂对话框。
- detach 后同实例内存 token 可能仍在,这与销毁/退出不同;清理策略必须与宿主预期一致。
- 进程恢复后按未登录路径重建,不把丢失 SDK 内存理解为异常退款/丢单;订单最终状态由服务端查询。
出现旧 Activity 回调或内存保留时,先检查单例持有 SDK、final Listener、外部执行器和宿主回调闭包;不要只重复调用 hideFloat。按 设备验收清单 记录真实设备证据。
恢复失败和宿主持久化
恢复验证成功前保持“正在验证”界面。NETWORK_ERROR/上游暂时失败保留加密候选供重试;INVALID_SESSION 或明确会话失效时删除候选,scope 不符不要跨应用使用。onLogout 应删除当前应用的宿主持久化凭据,避免本地退出后恢复旧数据。取消恢复或开始新登录后,迟到结果不能发布身份。