提问人:Panos 提问时间:1/7/2015 更新时间:1/9/2015 访问量:2293
通过引用在活动之间传递对象
Android pass object between activities by reference
问:
我有一个对象,我使用 Intent 将 2-3 个活动作为 Parseable/Serialisable 传递。例如,当对象从 Activity1 变为 Activity3 时,我想要的是
Activity1->Activity2->Activity3
Activity3 在对象中执行一些更改,然后 Activity3 完成,Activity2 完成,我们返回到 Activity1,然后我希望 Activity1 了解 Activity2 和 Activity3 中所做的更改。
请记住,我不赞成使用单例方法,也不赞成使用“onActivityResult”,因为我可能需要对多个对象进行更改。我尝试使用一种带有访问 Activity3 的接口的方法来遵循它,当进行更改时,它会强制以前的 Acitivy 也更新,但很难维护它并遵循它。
在 iOS 中,当您将对象传递到下一个视图时,它是通过引用进行的,因此可以立即进行更改。
有什么建议吗?
答:
由于这是运行时数据,因此不建议使用 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;
这样,您将在活动中维护一个对象。
评论
也许您可以使用一种设计模式:观察者模式
使用此模式,您可以在活动 2 和 3 更改对象时通知活动 1。
这里有一些信息:
- http://en.wikipedia.org/wiki/Observer_pattern
- https://andhradroid.wordpress.com/2012/04/05/object-observer-pattern-in-android/
希望它能解决您的问题!
有好的一天!
根据我的经验,如果将对象作为 Parcelable 传递,它将通过引用传递,并且一个活动的更改应反映在包含相同引用的所有活动中。
但是,我不认为这是一种非常可靠的方法。我建议使用并注册您的活动作为内容更改的观察者。ContentProvider
http://www.grokkingandroid.com/use-contentobserver-to-listen-to-changes/
评论
我使用的方法是:
在我的第一个活动中,我使用以下方式调用第二个活动:
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 方法(不要调用超级实现)并从那里调用上述代码。
评论