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

Android pass object between activities by reference

提问人:Panos 提问时间:1/7/2015 更新时间:1/9/2015 访问量:2293

问:

我有一个对象,我使用 Intent 将 2-3 个活动作为 Parseable/Serialisable 传递。例如,当对象从 Activity1 变为 Activity3 时,我想要的是

Activity1->Activity2->Activity3

Activity3 在对象中执行一些更改,然后 Activity3 完成,Activity2 完成,我们返回到 Activity1,然后我希望 Activity1 了解 Activity2 和 Activity3 中所做的更改。

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

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

有什么建议吗?

Android-intent 传递引用

评论

0赞 Maor Hadad 1/7/2015
共享偏好可以在这里为您提供帮助
0赞 Carnal 1/7/2015
@MaorHadad:SharedPreference 不支持 Serializable 对象。
0赞 Carnal 1/7/2015
@Panos:为什么不对控制器类使用读/写方法?
0赞 Maor Hadad 1/7/2015
@肉体:engineering.meetme.com/2014/03/......
0赞 Carnal 1/7/2015
@MaorHadad:是的,当然,GSON 会将其转换为字符串。

答:

0赞 Vilas 1/7/2015 #1

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

例。

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;

这样,您将在活动中维护一个对象。

评论

1赞 Mina F. Beshay 5/16/2018
我认为这个解决方案打破了 OOP 原则
0赞 LeMimit 1/7/2015 #2

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

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

这里有一些信息:

希望它能解决您的问题!

有好的一天!

0赞 Tomislav Novoselec 1/7/2015 #3

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

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

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

评论

1赞 Panos 1/9/2015
不。据我所知,将对象作为 Parcelable 传递并不像通过引用传递那样有效。它仍会创建对象的新实例。
0赞 Panos 1/9/2015 #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 方法(不要调用超级实现)并从那里调用上述代码。