Android:如何在两个活动之间传递信息

4

我正在尝试将信息(更具体地说,是包含信息的类)从一个活动传递到另一个活动。在我的应用程序中,我有一个启动屏幕,负责加载和初始化变量。目标是将这些信息传递给实际的游戏本身,以便可以使用,但我不知道如何做到这一点。在我的启动屏幕类中,我有这个方法,负责在所有内容加载完成后从启动屏幕跳转到游戏:

private void moveToGame() {
    loop.setRunning(false);
    act.startActivity(new Intent(splash, MainActivity.class));
    act.finish();
    return;
}

主要的活动类然后有这行代码来进入实际游戏:
setContentView(new Environment(this, this));

Environment类的构造函数是Environment(Context context, Activity act)

目标是将构造函数更改为Environment(Context context, ActivityAct, LoadInfo li),但是如何将信息传递到Environment构造函数呢?

编辑1 - LoadInfo类

public class LoadInfo {
    private HashMap<String, Typeface> fonts;
    private HashMap<String, Image> images;
    private File logFile;
    private File settingsFile;
    private File gameDir;

    public LoadInfo() {}

    public LoadInfo(HashMap<String, Typeface> fonts, HashMap<String, Image> images, File logFile, File settingsFile, File gameDir) {
        this.fonts = fonts;
        this.images = images;
        this.logFile = logFile;
        this.settingsFile = settingsFile;
        this.gameDir = gameDir;
    }

    public HashMap<String, Typeface> getFonts() {
        return fonts;
    }

    public HashMap<String, Image> getImages() {
        return images;
    }

    public File getLogFile() {
        return logFile;
    }

    public File getSettingsFile() {
        return settingsFile;
    }

    public File getGameDir() {
        return gameDir;
    }

    public void setFonts(HashMap<String, Typeface> fonts) {
        this.fonts = fonts;
    }

    public void setImages(HashMap<String, Image> images) {
        this.images = images;
    }

    public void setLogFile(File logFile) {
        this.logFile = logFile;
    }

    public void setGameDir(File gameDir) {
        this.gameDir = gameDir;
    }

    public void setSettingsFile(File settingsFile) {
        this.settingsFile = settingsFile;
    }

    public boolean fullyLoaded() {
        return fonts != null && images != null && logFile != null && gameDir != null && settingsFile != null;
    }

    public String toString() {
        if(logFile == null)
            return "well no file to load";
        return logFile.toString();
    }
}

什么是 LoadInfo ..? - Muthukrishnan Rajendran
@MuthukrishnanRajendran 包含我想传递给“环境”的所有信息的类。例如,我将在“LoadInfo”中拥有一个方法,看起来像public int getValue(),然后返回在启动画面期间初始化的值。 - Ryan
你能把你的LoadInfo类加进来吗? - Muthukrishnan Rajendran
已完成 @MuthukrishnanRajendran - Ryan
我更新了我的回答。 - Muthukrishnan Rajendran
2个回答

3
您可以将LoadInfo序列化,如下所示:
public class LoadInfo implements Serializable {
    // your code,
}

在您的Splash Activity中,您可以这样发送:
//LoadInfo loadInfo = new LoadInfo(); this may be your loadInfo object

Intent intent = new Intent(act, MainActivity.class);
intent.putExtra("load_info", loadInfo); // Add your LoadInfo object here
act.startActivity(intent);

在你的MainActivity中,可以像这样获得:
LoadInfo loadInfo = (LoadInfo) getIntent().getSerializableExtra("load_info");
setContentView(new Environment(this, this, loadInfo));

这似乎可以工作,但我遇到了一个错误,我不知道它是否是由此引起的。当我尝试调用loadInfo.toString()时,我会得到NullPointerException,包括在原始的LoadInfo类被创建的闪屏屏幕类中。实际上,即使我检查过对象(在这种情况下是一个File)不为空,我也会为每个“get”方法得到NullPointerException。这是由于此问题还是其他问题现在变得明显了? - Ryan
请在您的问题中添加代码,我会检查并告诉您。 - Muthukrishnan Rajendran
完成,如果您需要更多上下文,请告诉我。感谢您的所有帮助。 - Ryan
你在 SplashScreen 中调用 moveToGame() 之前添加了 setGameDir 吗? - Muthukrishnan Rajendran
结果是肯定的和否定的。我确实有一个代码块,但是还有另外一段代码我本来想删除的,它重置了loadInfo对象,导致了问题。我把它删除了,现在一切都完美地运行了。非常感谢你的帮助。 - Ryan
欢迎,朋友 :) - Muthukrishnan Rajendran

0

警告:Intent extra 有一个1Mb的限制:

为了将信息从一个Activity传递到另一个Activity,通常使用Intent extra,但它有1MB数据的限制。在您的问题中,您正在使用LoadInfo类,我相信它可以轻松地传递1MB大小,因为它加载游戏信息。

建议:您可以选择实现ApplicationService(即Bound Service)来存储此LoadInfo实例,所有活动都可以访问此实例。

更多提示:您还可以使用存储此LoaderInfo实例的Singleton类,但应在关闭游戏的所有活动后将其删除。

注意:闪屏作为一个Activity,您必须记得将其从Back Stack中删除,否则,当用户单击返回时,它将返回到闪屏Activity


我会研究这些建议,因为我同意LoadInfo类也可以轻松传递1MB。至于启动画面作为“Activity”,我在模拟器或物理设备中都没有遇到过这个问题。 - Ryan
你是正确的,因为你使用了 act.finish();,这将销毁此 Activity 并从 Back Stack 中移除它。 - Victor Rattis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接