Android应用销毁时如何实现Firebase实时数据库数据自动删除?
最优解决方案:使用Firebase Realtime Database原生的OnDisconnect机制
这是Firebase官方针对客户端意外退出、生命周期方法执行中断场景设计的特性,所有删除操作由服务端触发,完全不依赖客户端代码执行:
- 提前注册断开自动删除规则
在用户登录成功、拿到地理位置网格matrix之后,先给所有需要清理的GPS路径节点注册断开删除操作,再写入服务数据:
该规则注册后,无论客户端是主动登出、App被系统强行终止、断网、进程意外崩溃,只要Firebase服务端检测到客户端连接断开,就会自动执行预设的删除操作,不存在执行中断的问题。for (int x = 0; x < MainActivity.matrix[0].length; x++) { for (int y = 0; y < MainActivity.matrix.length; y++) { DatabaseReference gpsRef = FirebaseDatabase.getInstance().getReference(MainActivity.GPS_PATH) .child(String.valueOf(MainActivity.matrix[y][x])); // 向Firebase服务端注册规则:客户端连接断开时,自动删除该节点 gpsRef.onDisconnect().removeValue(); // 注册完成后再写入当前服务提供者的信息 gpsRef.setValue(你的服务数据对象); } } - 保留主动登出逻辑
你现有的AuthStateListener删除逻辑可以继续保留,用户主动点击登出按钮时会第一时间主动清理数据,无需等待服务端的断开检测延迟。两种逻辑互不冲突:如果客户端已经主动完成了节点删除,服务端注册的OnDisconnect操作会自动作废,不会重复执行。 - 修正现有onDestroy的逻辑bug
你现在在onDestroy中调用mAuth.signOut()是错误的:Activity销毁不代表App进程终止(比如用户按返回键退到桌面,App仍在后台运行),此时调用登出会触发删除逻辑,导致后台运行的服务提供者无法被检索。只需要保留fusedLocationClient.removeLocationUpdates(locationCallback)即可,仅在用户主动点击登出按钮时调用mAuth.signOut()。 - 后台在线状态保持
只要App在后台运行时没有被系统断网、进程没有被回收,Firebase的连接就会保持活跃,服务端不会触发OnDisconnect删除,服务提供者可以正常被检索,符合你的需求。
内容的提问来源于stack exchange,提问作者Victor Humphrey
相关产品推荐
相关产品推荐

