Android 存储要向对象打开的活动

Android 存储要向对象打开的活动,android,Android,我正在共享首选项中存储一个意图,如下所示: new Intent(context, MainActivity.this); 当我试图打开它时,我得到了错误: android.content.ActivityNotFoundException: No Activity found to handle Intent { } 我假设这是因为上下文指的是存储的活动?当上下文应为当前活动时 我的问题是我该如何避开这个问题?我有几个按钮,由存储在首选项中的对象填充。他们中的每一个都会开启不同的活动

我正在共享首选项中存储一个意图,如下所示:

new Intent(context, MainActivity.this);
当我试图打开它时,我得到了错误:

  android.content.ActivityNotFoundException: No Activity found to handle Intent {  }
我假设这是因为
上下文
指的是存储的活动?当
上下文
应为当前活动时

我的问题是我该如何避开这个问题?我有几个按钮,由存储在首选项中的对象填充。他们中的每一个都会开启不同的活动。基本上,我将活动映射为打开按钮

给你一个想法:

public class Scene implements Serializable {
    public String label;
    public Intent intent;
    public boolean isUnlocked;

    public Scene(String lbl, Intent i) {
        this.label = lbl;
        this.intent = i;
    }
}

for (Scene scene : savedScenesFromSharedPreferences) {
    Button btn = new Button();
    btn.setOnClickListener(new OnClickListener()) {
       startActivity(scene.intent);
    }
}
您可以尝试以下方法:

在场景类中,保存活动名称而不是保存意图。

要启动活动,请执行以下操作:

    startActivity(new Intent(YourCurrentActivity.this, Class.forName(scene.getActivityName)));

这与不坚持
意图无关。保留某种类型的稳定标识符,例如整数。然后,在运行时,决定如何使用该标识符处理场景。现在,您的解决方案非常脆弱。它无法很好地处理更改,例如决定重命名您的活动、将您的活动移动到另一个Java包、需要在
Intent
上添加额外内容、更改为使用片段、更改为使用导航组件、更改为使用Jetpack Compose、,数据存储格式应独立于GUI的组装方式;您当前的方法将这两者紧密地联系在一起。@commonware我只需要加载场景(即活动)。我不需要这些。我想我必须对所有内容进行硬编码。“我只需要加载场景(即活动)”——这就是您今天加载场景的方式。您的计划将来可能会更改,但用户设备上现有文件的文件格式不会更改。例如,与谷歌当前的建议(每个屏幕一个片段)相比,您已经在使用过时的开发技术(每个屏幕一个活动),更不用说与谷歌的长期方向(每个屏幕一个可组合)相比了。如果你希望你的应用能够长期使用,请设计文件格式以适应变化。场景是游戏的各个级别。我每个级别都有一个活动。我之所以保存这些场景,是因为它们具有不同的状态(即未锁定)。也许我可以将意图存储在变量中?然后将状态存储在首选项中,并在加载时将其映射到每个场景。
    startActivity(new Intent(YourCurrentActivity.this, Class.forName(scene.getActivityName)));