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

时间:2015-01-07 14:03:25

标签: android android-intent pass-by-reference

我有一个对象,我使用Intents将2个活动作为Parseable / Serialisable传递。我想要的是例如当对象从Activity1进入Activity3

Activity1->Activity2->Activity3

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

请记住,我并不赞成使用Singleton方法,而不是" onActivityResult"因为我可能需要在多个对象中进行更改。我试图使用一种接口到达Activity3的方法来跟踪它,当进行更改时,它也会强制先前的Acitivy更新,但是很难维护它并遵循它。

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

有什么建议吗?

4 个答案:

答案 0 :(得分:0)

由于这是运行时数据,因此不建议使用共享首选项。创建一个名为RunTimeData.java的类。在此声明所有必需变量为static。每当您需要保存数据时,请将其保存到这些变量中。在其他类中使用数据后,请确保通过将变量设置为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 :(得分:0)

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

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

这里的一些信息:

希望它能解决你的问题!

度过愉快的一天!

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

我使用的方法是:

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

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方法(不要调用超级实现)并从那里调用上面的代码。 / p>