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

Kotlin中通过SharedPreference字符串启动Activity报错求助

问题解决:通过SharedPreference存储的类名启动Activity

错误原因

你之前的代码里,activityHandler::class.java获取的是String类的Class对象,而不是目标Activity的Class,系统自然找不到对应的Activity,所以抛出ActivityNotFoundException。

修复方案

步骤1:存储完整类名(推荐)

存储时最好存入Activity的完整类名(包名+类名),避免类名冲突或找不到类:

sharedSettingsData.edit()
    .putString("settingsLogin", "com.example.myapp.ConfigureActivity")
    .apply()

步骤2:读取并反射获取Activity类

通过Class.forName()方法,根据存储的完整类名反射得到目标Activity的Class对象,再启动Activity:

val activityClassName = sharedSettingsData.getString("settingsLogin", "")
if (activityClassName.isNotEmpty()) {
    try {
        // 通过完整类名获取Activity的Class
        val activityClass = Class.forName(activityClassName)
        val intent = Intent(this, activityClass)
        startActivity(intent)
    } catch (e: ClassNotFoundException) {
        // 处理类找不到的异常,比如提示用户或跳转默认页
        e.printStackTrace()
    }
}

可选:仅存储简单类名的处理

如果只想存储类名(如"ConfigureActivity"),可以读取时拼接当前应用的包名:

val simpleClassName = sharedSettingsData.getString("settingsLogin", "")
if (simpleClassName.isNotEmpty()) {
    try {
        // 拼接包名和类名得到完整类路径
        val fullClassName = "${packageName}.$simpleClassName"
        val activityClass = Class.forName(fullClassName)
        val intent = Intent(this, activityClass)
        startActivity(intent)
    } catch (e: ClassNotFoundException) {
        e.printStackTrace()
    }
}

注意事项

  • 所有要启动的Activity必须在AndroidManifest.xml中注册,否则即使类名正确也会报错。
  • 反射操作可能抛出异常,务必添加异常捕获逻辑,避免应用崩溃。

内容的提问来源于stack exchange,提问作者mohammed_sajid

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 19:25:20