Kotlin中如何实现双Activity切换与启动状态的持久化保存
双Activity动态切换默认启动页的实现方案
核心实现逻辑
通过持久化存储记录用户上次停留的目标页面,设置独立的路由入口页作为应用唯一的启动入口,每次启动时读取存储的状态直接跳转到对应页面,避免原页面互相跳转导致的栈循环崩溃。
分步实现流程
- 调整AndroidManifest.xml启动配置
不要直接将Activity1或Activity2设为桌面启动页,新建一个无界面的RouteActivity作为唯一启动入口,给该页面配置LAUNCHER类型的intent-filter;Activity1、Activity2不添加任何启动类intent-filter,从根源上避免系统识别多启动入口导致的崩溃、桌面生成多图标的问题。 - 定义持久化存储规则
采用SharedPreferences存储启动目标标识,使用整型值替代布尔值降低状态误判概率:存储键:
default_launch_target
可选值:1对应默认启动Activity1,2对应默认启动Activity2
首次安装无存储值时,默认读取为1,匹配首次启动进入Activity1的需求。 - 编写路由页的跳转逻辑
在RouteActivity的onCreate生命周期中完成状态读取与跳转:- 从SharedPreferences中读取当前存储的目标启动值,同时读取之前存下的用户输入文本,解决直接跳转Activity2时无内容展示的问题
- 根据目标值创建对应Activity的跳转Intent
- 给跳转Intent添加
FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TASK标记,清空原有任务栈,避免路由页残留 - 跳转完成后立即调用
finish()关闭RouteActivity,保证用户按返回键不会回到不可见的路由页。
- 编写两个业务页面的状态更新逻辑
- Activity1的跳转按钮点击时:
- 先把输入框的文本内容存入SharedPreferences,保证重启后进入Activity2时可以读到之前的内容
- 将SharedPreferences中的
default_launch_target值更新为2 - 带上同样的栈清理跳转标记,跳转到Activity2
- Activity2的切回按钮点击时:
- 将SharedPreferences中的
default_launch_target值更新为1 - 带上栈清理跳转标记,跳转到Activity1
- 将SharedPreferences中的
- Activity1的跳转按钮点击时:
常见异常原因说明
- 循环跳转崩溃:直接在Activity1或Activity2的
onCreate中嵌入跳转逻辑,会触发A跳B、B反向跳A的无限循环,最终栈溢出崩溃 - 启动状态误判:用
apply()异步提交SharedPreferences时,若应用在值落盘前被系统回收,会导致存储值未更新,下次启动回到错误页面;状态更新时推荐用commit()做同步提交,保证值立刻写入磁盘 - 返回键逻辑异常:跳转时未添加清空任务栈的跳转标记,任务栈残留历史页面,会出现按返回键回到非预期页面,甚至触发空指针崩溃
核心代码片段
RouteActivity路由跳转核心代码:
class RouteActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val sp = getSharedPreferences("app_config", MODE_PRIVATE) val target = sp.getInt("default_launch_target", 1) val inputContent = sp.getString("user_input", "") val intent = when(target) { 2 -> Intent(this, Activity2::class.java).putExtra("input_content", inputContent) else -> Intent(this, Activity1::class.java).putExtra("saved_input", inputContent) } intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK startActivity(intent) finish() } }
Activity1跳转按钮逻辑:
jumpBtn.setOnClickListener { val currentInput = inputEt.text.toString() getSharedPreferences("app_config", MODE_PRIVATE) .edit() .putInt("default_launch_target", 2) .putString("user_input", currentInput) .commit() val intent = Intent(this, Activity2::class.java).apply { putExtra("input_content", currentInput) flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK } startActivity(intent) finish() }
Activity2切回按钮逻辑:
backBtn.setOnClickListener { getSharedPreferences("app_config", MODE_PRIVATE) .edit() .putInt("default_launch_target", 1) .commit() val intent = Intent(this, Activity1::class.java).apply { flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK } startActivity(intent) finish() }
内容的提问来源于stack exchange,提问作者Umar zzstu Syed
相关产品推荐
相关产品推荐

