Android序列化/对象传递和返回

4
我有一个管理工单的应用程序。在应用程序的某个部分,我有一个从Web服务检索到的工单列表。然后用户从列表中选择一个工单,列表会启动一个新的活动(传递工单对象),显示工单详细信息。此时用户可以编辑工单的某些部分。如果用户返回到列表(通过返回按钮),我需要将修改后的工单传回工单列表,并更新或替换旧的对象为新的修改后的对象。否则,(目前正在发生的)用户编辑工单,但是如果他们返回到列表并再次选择相同的工单,则工单详细信息活动会显示所有旧数据。如何解决这个问题?目前我已经让Workorder类实现Serializable接口,以便将工单对象传递给后续活动。

所以这个可以工作: 列表 -> 工单A

但这里是我遇到问题的地方: 列表 <- 工单A(已修改)

我不确定是否应该使用startActivtyForResult,并将工单对象传回去。我知道这是一个可能性,但我不确定是否有更优雅的方法来解决这个问题。非常感谢任何和所有帮助!


请发布您的Workorder类和相关代码部分。 - Caner
1个回答

10
如果你的Workorder对象已经是Serializable类型,你可以很容易地将该对象传递到一个意图的Bundle中。要将对象保存到意图中,你需要执行以下操作:
intent.putExtra("SomeUniqueKey", [intance of workorder]);

并在另一个活动中加载:

Workorder workorder = (Workorder) intent.getSerializableExtra("SomeUniqueKey");

如果你正在使用startActivityForResult,那么它应该如下所示:

WorkorderListActivity.java:

Intent intent = new Intent(this, WorkorderDetailsActivity.class);
intent.putExtra("SomeUniqueKey", _workorder);
startActivityForResult(intent, [UniqueNumber]);

protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
     if (requestCode == [UniqueNumber])
     {
         if (resultCode == RESULT_OK)
         {
             Workorder workorder = (Workorder) intent.getSerializableExtra("SomeUniqueKey");
             // Do whatever with the updated object
         }
     }
 }

WorkorderDetailsActivity.java:

public void onCreate(Bundle savedInstanceState)
{
     Bundle bundle = getIntent().getExtras();
     _workorder = (Workorder) bundle.getSerializable("SomeUniqueKey");
     // Display the object
}

public void onBackPressed()
{
    // Update _workorder object
    Intent intent = getIntent();
    intent.putExtra("SomeUniqueKey", _workorder);
    setResult(RESULT_OK, intent);
}

我相信这应该可以工作。


我会尝试一下,看看我能做什么!如果有效,我会回来标记它已回答。 - D.R.
关于这个问题,我意识到之前在发送活动上使用的是 .putExtra("wo", wo),而在接收活动上使用的是 .get("wo") 而不是 .getSerializable("wo"),但它仍然能够正常获取对象。这是设计意图还是我违反了一些重要规则? - D.R.
我从未真正尝试过,但我猜想.get("wo")应该是可行的。你会得到一个在运行时类型为Serializable的对象,并将其设置为你的Workorder变量会自动进行转换。据我所知,没有违规行为。 - Alex
我想补充一下,建议在设置Extra和获取Extra时都使用完整的包名来引用这个序列化对象。例如: Workorder workorder =(Workorder)intent.getSerializableExtra(“com.package.SomeUniqueKey”); 和 getIntent()。getExtras()。getSerializable(“com.package.SomeUniqueKey”); 如果您的对象具有其他嵌套对象,则它们也必须实现Serializable接口。 - Oscar Salguero

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