在Android应用程序中使用startActivityForResult

时间:2012-03-04 15:38:42

标签: android android-intent intentfilter cross-application

我编写了一个<intent-filter/>的应用程序,以便其他应用程序可以使用startActivityForResult()启动它。完成此活动后,它创建了一个对象,如:

(申请A)

 public class MyObject implements Serializable {
      private String name;
      private String[] items
 }

并在结果上设置它:

(申请A)

 getIntent().putExtra("Extra_MyObject", myObject);
 setResult(RESULT_OK, getIntent());

因此,收到此意图的第二个活动存在问题,如何知道要接收的意图名称如何创建收到的对象并将其强制转换为不属于此应用程序的MyObject

(申请B)

  @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(requestCode == MY_REQ_CODE){
        if(resultCode == RESULT_OK){
                 // So here how do I know what the intent data name is i.e. "Extra_MyObject"
                 // and how would I know the structure to cast the object back to a MyObject that isn't part of this project?

        }
    }
}

我是否只是模仿第二个应用程序中的MyObject类并将其转换为该类? 或者还有其他选择吗?

2 个答案:

答案 0 :(得分:3)

您可以使用像Jackson这样的库将对象序列化为JSON字符串,然后在另一端反序列化。

它更加灵活,如果你决定添加一个额外的字段,它将消除传递数据版本不一致的问题。

此外,这两个应用程序不再需要在同一名称空间中维护一个类,甚至不需要使用相同的名称来调用它们。

作为最后一点,您不再需要发布jar,只需要您的文档即可。

答案 1 :(得分:1)

  

它如何知道接收的意图名称

阅读第一个应用程序作者发布的API文档。

  

如何创建收到的对象并将其强制转换为不属于此应用程序的MyObject?

第一个应用程序的作者还必须发布一个包含MyObject实现的JAR,第二个应用程序的作者将添加到他们的项目中。并且,第一个应用程序的作者要么永远不必更改MyObject,要么至少确保序列化版本控制工作正常。

  

我是否只是模仿第二个应用程序中的MyObject类并将其强制转换为那个?

如果通过“模仿”表示“有一个类具有完全相同的类名,完全相同的包名称,以及完全相同的序列化逻辑”,那么是的,尽管我当时担心你使用的术语“只是” “......: - )

如果MyObject具有您描述的结构,请考虑将StringString[]作为单独的附加内容,或者将它们放在Bundle中并将其作为额外内容使用,以避免尝试在应用程序之间使用自定义Parcelable对象。