Android开发:Activity间传输用户名且传输后不持久化的方案选型
应该选择方案2:使用共享ViewModel临时存储数据,在UserProfileActivity中访问,以下是各方案的详细分析:
方案1(Intent + Bundle):Intent携带的Bundle数据会被系统序列化后存入Binder缓冲区,若系统需要回收内存,还可能将这些数据写入磁盘(比如配置变更场景),存在意外持久化的风险。同时,目标Activity获取数据后,原Intent中的数据仍可能留在内存中,无法满足“传输后不在内存中持久化”的要求。
方案2(共享ViewModel):通过共享ViewModel(比如基于Activity级别的ViewModelProvider,或Navigation组件的共享ViewModel机制),Login Activity将用户名存入ViewModel,UserProfile Activity直接读取使用,之后可主动清空ViewModel内的用户名数据。ViewModel的生命周期与关联组件绑定,Login Activity销毁后,ViewModel会在合适时机被系统回收,数据既不会写入磁盘持久化,也能在使用后及时清理内存残留,完全符合需求。
方案3(自定义Parcelable通过Intent传递):本质和方案1没有区别,只是序列化方式换成了Parcelable,依然存在数据被系统写入磁盘、内存残留的问题,还额外增加了代码复杂度,完全没必要。
方案4(SharedPreferences):这是持久化存储方案,数据会被写入设备本地的XML文件,完全违反“不能持久化”的要求,而且敏感的用户名数据存入SharedPreferences还存在泄露风险,绝对不可取。
内容的提问来源于stack exchange,提问作者itsTanany

