使用public static
变量(如Ganesh的答案)会的工作,但在一般情况下,这并不是说我会建议一个面向对象的模式。
幸运的是,这个可以比黑莓更容易在Android中。对于许多Java开发人员来说,Android的Intent
机制实际上有些不自然。当其中一个Activity
通过Intent
启动另一个Activity
时,它实际上并不是new
(创建)第二个Activity
的实例,它也不包含对该对象的正常Java引用。如果是这样,这个问题会简单得多。 Android的实施迫使你使用意图额外的机制。
如果你的旧ActivityOne
类成为ScreenOne
黑莓,和ActivityTwo
成为ScreenTwo
,那么你可以做这样的事情:
public class ScreenTwo extends Screen {
private String _value1; // this doesn't have to be a String ... it's whatever you want
private String _value2;
public void setValue1(String value) {
_value1 = value;
}
public void setValue2(String value) {
_value2 = value;
}
}
然后,在ScreenOne
,你就可以开始ScreenTwo
这样
ScreenTwo nextScreen = new ScreenTwo();
nextScreen.setValue1("This value one for ActivityTwo");
nextScreen.setValue2("This value two ActivityTwo");
UiApplication.getUiApplication().pushScreen(nextScreen);
这实际上更符合Java对象通常使用的方式, nd彼此互动。
有很好的理由,为什么Android的Intents
和临时演员,但在黑莓,你不必担心。
编辑:我想考虑一下我认为背后低于史密斯先生的评论的动机。如果你实际上喜欢Android Intent
extras机制,就可以将多个数据类型从一个Activity
传递给另一个,作为键值对,那么你肯定可以在BlackBerry中实现类似的功能。而不是上面的代码ScreenTwo
,你可以这样做:
public class ScreenTwo extends Screen {
private Hashtable _extras;
public void putExtras(Hashtable extras) {
_extras = extras;
}
}
在那里你put(Object, Object)
键值对数据在传递到所谓的屏幕Hashtable
,然后读取它,当你需要它。甚至:
public class ScreenTwo extends Screen {
private Hashtable _extras;
public void putExtra(String name, Object value) {
_extras.put(name, value);
}
}
“这不一定是一个字符串...”:此评论显示了如何将呼叫屏幕耦合到更新的屏幕。如果您决定更改'_value1'类,则还需要更改setter方法。另一方面,它是类型安全的。 – 2012-07-09 07:44:29
@MisterSmith,当然,如果底层数据类型发生变化,您需要更改setter方法。几乎任何类别的几乎任何财产都是如此。很少的API使用传递'Object'作为它们的数据类型。在某些情况下,这是有保证的,但这是例外,而不是规则。在Android中,调用'Activity'仍然*耦合到被调用的'Activity',因为它知道它传递的数据类型。我不确定你的评论是在这里... – Nate 2012-07-09 08:27:40
@MisterSmith,我还会跟进Android意见**。我不认为现有的实现是由于希望从调用者*分离*所谓的“活动”类驱动的。调用者仍然需要传递正确数据类型的附加内容,并且键名仍需要由两个活动达成一致。很多时候,这些键名称实际上是作为被称为“Activity”子类中的“String”常量实现的(不是最松散的耦合形式)。我认为更大的动机是'意图'允许操作系统管理活动生命周期。 – Nate 2012-07-09 08:44:03