Android接收用户数据后修改启动Activity:后续直进DailyActivity如何实现
实现方案
总共分4步完成,全程使用Android原生API即可实现,无需引入第三方依赖:
步骤1:添加轻量持久化存储,保存状态和计算结果
用系统自带的SharedPreferences存储两类数据:首次采集完成标记、BMI和BMR数值,你可以直接在需要存数据的地方调用,也可以封装成工具方法:
// 存数据的工具方法,可直接写到Activity中 private fun saveUserData(bmi: Float, bmr: Float) { getSharedPreferences("app_config", MODE_PRIVATE).edit() .putBoolean("is_first_launch_completed", true) .putFloat("saved_bmi", bmi) .putFloat("saved_bmr", bmr) .apply() }
步骤2:新增无UI启动路由页(可选但推荐,避免跳转闪烁)
把这个SplashActivity设为应用的启动入口,在AndroidManifest.xml里把它的intent-filter设为LAUNCHER category,原有MainActivity和DailyActivity去掉LAUNCHER配置即可:
class SplashActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val sp = getSharedPreferences("app_config", MODE_PRIVATE) val isCompleted = sp.getBoolean("is_first_launch_completed", false) val targetIntent = if (isCompleted) { Intent(this, DailyActivity::class.java) } else { Intent(this, MainActivity::class.java) } // 清栈跳转,避免返回回到Splash页 targetIntent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK startActivity(targetIntent) finish() } }
如果你不想新增启动页,也可以直接把DailyActivity设为启动页,在它的onCreate最前面做上述判断,未完成采集直接跳MainActivity即可。
步骤3:修改原有MainActivity的完成按钮逻辑
你原来的点击事件需要补充存数据、清栈跳转的逻辑,修改后代码如下:
binding.doneButton.setOnClickListener { checkValid() if (valid){ val bmi = calculateBmi().round(1) val bmr = calculateBmr().round(2) // 先存数据到本地 saveUserData(bmi, bmr) // 跳转后清掉当前MainActivity,避免返回回到采集页 Intent(this, DailyActivity::class.java).also{ it.putExtra("EXTRA_BMI", bmi) it.putExtra("EXTRA_BMR", bmr) it.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK startActivity(it) finish() } } }
步骤4:DailyActivity加载本地数据
后续启动DailyActivity时直接从SharedPreferences读数据即可,无需依赖Intent传参:
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // 先尝试从Intent取首次跳转传的参数,取不到就读本地存储 val bmi = intent.getFloatExtra("EXTRA_BMI", 0f).takeIf { it != 0f } ?: getSharedPreferences("app_config", MODE_PRIVATE).getFloat("saved_bmi", 0f) val bmr = intent.getFloatExtra("EXTRA_BMR", 0f).takeIf { it != 0f } ?: getSharedPreferences("app_config", MODE_PRIVATE).getFloat("saved_bmr", 0f) // 后续正常使用bmi、bmr数值即可 }
补充说明
如果后续需要给用户提供重置数据的功能,只要把is_first_launch_completed标记设为false,同时清空存储的BMI、BMR数值,下次启动就会自动回到采集页。
内容的提问来源于stack exchange,提问作者rengsayed
相关产品推荐
相关产品推荐

