Android 通过引用在活动之间传递对象

Posted

技术标签:

【中文标题】Android 通过引用在活动之间传递对象【英文标题】:Android pass object between activities by reference 【发布时间】:2015-03-05 10:47:57 【问题描述】:

我有一个对象,我使用 Intents 通过 2-3 个活动作为可解析/可序列化的对象。我想要的是例如当对象从 Activity1 到 Activity3 时

Activity1->Activity2->Activity3

而Activity3对对象做了一些改变,然后Activity3结束,Activity2结束,我们回到Activity1,那么我想让Activity1知道Activity2和Activity3所做的改变。

请记住,我不赞成使用单例方法,也不赞成使用“onActivityResult”,因为我可能需要对多个对象进行更改。我尝试使用一种方法来遵循它,该方法的接口可以到达 Activity3,当进行更改时,它也会强制以前的 Activivy 更新,但很难维护和遵循它。

ios 中,当您将对象传递给下一个视图时,它是通过引用进行的,因此更改立即可用。

有什么建议吗?

【问题讨论】:

共享偏好在这里可以为您提供帮助 @MaorHadad:SharedPreference 不支持可序列化对象。 @Panos:为什么不在控制器类中使用读/写方法? @肉体:engineering.meetme.com/2014/03/… @MaorHadad:是的,当然使用 GSON 将其转换为字符串。 【参考方案1】:

由于这是运行时数据,因此不建议使用 sharedpreference。创建一个名为 RunTimeData.java 的类。在这里将所有必需的变量声明为静态变量。每当您需要保存数据时,请将其保存到这些变量中。使用其他类中的数据后,请确保将变量设置为空。

示例。

public class RunTimeData
public static Object name=null;

在分配数据时,请按如下方式使用。

RuntimeData.name=(Object)name;
String firstName=RunTimeData.name.getFirstName();

在使用数据时使用如下。

RunTimeData.name.setLastName("xxx");
RunTimeData.name=name;

当您确定不会在某处再次使用该值时释放该变量。

RunTimeData.name=null;

通过这种方式,您将在活动中维护一个对象。

【讨论】:

我认为这个解决方案颠覆了 OOP 原则【参考方案2】:

也许你可以使用一种设计模式:观察者模式

使用此模式,您可以在 Activity 2 和 3 更改对象时通知 Activity 1。

这里有一些信息:

http://en.wikipedia.org/wiki/Observer_pattern https://andhradroid.wordpress.com/2012/04/05/object-observer-pattern-in-android/

希望它能解决你的问题!

祝你有美好的一天!

【讨论】:

【参考方案3】:

根据我的经验,如果您将对象作为 Parcelable 传递,它将通过引用传递,并且一个活动的更改应该反映在包含相同引用的所有活动中。

但是,我认为这不是一种非常可靠的方法。我建议使用ContentProvider 并将您的活动注册为内容更改的观察者。

http://www.grokkingandroid.com/use-contentobserver-to-listen-to-changes/

【讨论】:

没有。据我所知,将对象作为 Parcelable 传递不像通过引用传递那样工作。它仍然会创建一个新的对象实例。【参考方案4】:

我使用的方法是:

在我的第一个活动中,我使用以下方法调用第二个:

startActivityForResult(Activity2.class, MyConstants.WAITING_FOR_X_RESULT);

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) 
    super.onActivityResult(requestCode, resultCode, data);

    //check for updated photos
    if (requestCode == MyConstants.WAITING_FOR_X_RESULT ) 
        if (resultCode == RESULT_OK)               
            MyObject myObject = (MyObject ) data.getSerializableExtra(MyConstants.MY_OBJECT_INTENT); //get result from next activity
            this.myObject = myObject;
            notifyDatasetChanged(); //helper method to reload data
        
    

在我结束时的第二个活动中,我打电话:

Intent intent = new Intent();
intent.putExtra(MyConstants.MY_OBJECT_INTENT, myObject);
setResult(RESULT_OK, intent);
finish();

如果用户按下后退按钮返回时也需要更新数据,请不要忘记覆盖 onBackPressed 方法(不要调用超级实现)并从那里调用上述代码。

【讨论】:

以上是关于Android 通过引用在活动之间传递对象的主要内容,如果未能解决你的问题,请参考以下文章

Android 在活动之间传递大对象的最佳实践?

使用自定义对象时在活动android之间传递数据时出错

Android:在活动之间传递哈希映射

通过意图在活动之间传递自定义对象时出错

在android中的活动之间传递非原始类型的数据

最佳实践?在活动之间传递参数