You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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生命周期中完成状态读取与跳转:
    1. 从SharedPreferences中读取当前存储的目标启动值,同时读取之前存下的用户输入文本,解决直接跳转Activity2时无内容展示的问题
    2. 根据目标值创建对应Activity的跳转Intent
    3. 给跳转Intent添加FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TASK标记,清空原有任务栈,避免路由页残留
    4. 跳转完成后立即调用finish()关闭RouteActivity,保证用户按返回键不会回到不可见的路由页。
  • 编写两个业务页面的状态更新逻辑
    1. Activity1的跳转按钮点击时:
      • 先把输入框的文本内容存入SharedPreferences,保证重启后进入Activity2时可以读到之前的内容
      • 将SharedPreferences中的default_launch_target值更新为2
      • 带上同样的栈清理跳转标记,跳转到Activity2
    2. Activity2的切回按钮点击时:
      • 将SharedPreferences中的default_launch_target值更新为1
      • 带上栈清理跳转标记,跳转到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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.27 18:15:04