当我使用Intent传递时,如何保存序列化对象状态

时间:2017-10-31 00:03:09

标签: java android android-intent

我有以下课程:

public class Creature implements Serializable {
protected String name;

public String getName() {
    return this.name;
}

public void setName(String name) {
    this.name = name;
}
// Rest of the methods and variables
}

Player Class扩展了Creature:

public class Player extends Creature implements Serializable {
// Class code
}

我使用PlayerIntents的实例从一个活动传递到另一个活动:

// Activity A, passing the object
Intent charActivity= new Intent(this, CharacterActivity.class);
charActivity.putExtra("Player", player);
startActivity(goToCharacterActivity);

// Activity B, grabbing the object
Player player = (Player) getIntent().getSerializableExtra("Player");

现在,如果我在活动B中执行类似player.setName("Hello");的操作,“原始”对象名称不会更新,则新名称仅在此当前活动中有效,因为我只有本地“副本”物体。如果我必须使用Serializable,我该如何解决这个问题?

4 个答案:

答案 0 :(得分:0)

如果您希望他们在内存中引用相同的对象,则无法使用SerializableParcelable。 (将在内存中自动创建一个新对象)。

在这种情况下,我建议使用包含保存信息的静态字段的共享类。 E.g:

SharedInfo:

public class SharedInformation {
    public static Creature theCreature;
} 

活动A:像往常一样开始使用意图,但不要通过PersonCreature

活动B:

SharedInformation.theCreature.setName("Hello"); 

答案 1 :(得分:0)

我在github中有一个玩家列表的例子。我所做的是使用onActivityResult和startActivityForResult方法,它们允许在两个活动之间返回值。您可以查看完整示例并从我的github repoitory下载代码。

答案 2 :(得分:0)

因为你的意图名称不一样。

Intent charActivity= new Intent(this, CharacterActivity.class);

您使用charActivity作为名称。

更改

startActivity(goToCharacterActivity);

  startActivity(charActivity);

答案 3 :(得分:0)

如果你想在Activity之间传递尝试Bundle,就像这样

活动1:

Intent i =  new Intent(this,CharacterActivity.class);
Bundle playerBundle = new Bundle();
playerBundle.putSerializable("Player",player);
i.putExtras(playerBundle);
startActivity(i);

这是在活动2中检索包的方法:

Player player = (Player) getIntent.getSerializableExtra("Player");

并记住该示例中的关键点必须与此示例相同

  • 播放器

作为关键