Android中如何从登录Activity向非直接跳转的Activity传递ID?
嘿,这个场景太常见了!登录拿到的用户ID要在好几个非直接跳转的页面用,总不能每次都靠Intent层层传递吧?那太麻烦了,给你几个靠谱的方案,你根据自己项目的需求选:
这是最直接的方式,创建一个全局的单例类来存储用户ID,整个APP的任何组件都能直接访问。示例代码:
object AppGlobal { var userId: String? = null }
登录成功后直接赋值:
// 登录Activity里 AppGlobal.userId = "123456"
然后在任意Activity里直接取:
// Activity3里 val userId = AppGlobal.userId
注意:这种方式的缺点是APP杀死进程后数据会丢失,如果不需要持久化的话完全够用,要是需要重启APP还保留,就看下面的方案。
如果用户ID需要在APP重启后还能保留,用SharedPreferences就很合适,它会把数据存在本地文件里。示例代码:
// 登录Activity里存储 val sp = getSharedPreferences("UserInfo", MODE_PRIVATE) sp.edit().putString("userId", "123456").apply()
在其他Activity读取:
val sp = getSharedPreferences("UserInfo", MODE_PRIVATE) val userId = sp.getString("userId", "")
提醒:别存敏感信息哦!如果用户ID是敏感数据,建议加密后再存。
如果你用Jetpack组件,那用Application级别的ViewModel是最佳实践,它的生命周期和APP一致,不会因为Activity销毁重建而丢失数据,还能避免内存泄漏。示例代码:
首先创建一个ViewModel类,继承AndroidViewModel:
class UserViewModel(application: Application) : AndroidViewModel(application) { var userId: String? = null }
然后在登录Activity里获取并赋值:
val viewModel = ViewModelProvider.AndroidViewModelFactory.getInstance(application) .create(UserViewModel::class.java) viewModel.userId = "123456"
在Activity3里获取同一个实例:
val viewModel = ViewModelProvider.AndroidViewModelFactory.getInstance(application) .create(UserViewModel::class.java) val userId = viewModel.userId
这种方式既不用考虑持久化(如果不需要的话),又能保证数据在APP运行期间的一致性,非常适合现代Android项目。
如果你的用户ID还关联着其他用户信息(比如昵称、头像),或者需要做本地数据缓存,那直接把用户信息存在Room数据库里就更合适了。登录成功后插入或更新用户数据,其他页面直接查询即可,核心思路就是持久化存储,按需查询。
就是从Activity1把ID传给Activity2,再从Activity2传给Activity3……这种方式耦合度极高,后续加新页面或者改跳转逻辑的时候会疯掉,绝对不推荐!
内容的提问来源于stack exchange,提问作者theKnifer

