我想你已经看过我们对这个问题的回答了?如果没有,请先阅读。
背景
黑莓不使用Intent
对象,也没有直接的等价物。在 Android 中,Intent
使用对象有不同的原因:
- 简单地开始一个
Activity
- 将调用者与
Activity
自身Activity
分离
- 帮助 Android 管理
Activity
对象的生命周期(创建/挂起/恢复/销毁),如果人们只是直接创建它们,它就无法做到这一点new MyActivity();
那么,问题是,您要问的是这三个原因中的哪一个(或其他什么原因)?我的第一个猜测是#1 ...您只想能够开始活动。
首先,黑莓没有相同的概念Activity
。在 Android 中,您有一个View层,它通常由您的 XML 布局表示,可能带有一些扩展 Android 类的自定义 JavaView
类。
然后,Android 有一个Activity
层,类似于Model-View- Controller模式中的 Controller。Activity
不应该与 UI(视图)过于紧密地耦合,理想情况下,它不应该包含后端数据,后端数据应该存在于数据模型层中。
这真的很不错,因为程序员可以处理模型和控制器Activity
(
黑莓没有像 Android 的View层那样的东西。要构建 BlackBerry UI,如果您使用本机 BlackBerry Java 平台和工具,则必须使用 Java 代码进行。因此,出于这个原因,我发现很少有 BlackBerry 项目努力将Controller层与View层分开。另外,我认为软件项目越大,模型-视图-控制器就越重要,并且相对于桌面应用程序,智能手机应用程序通常更小。所以,无论好坏,我认为这是 MVC 没有更直接地内置到 BlackBerry API 中的一个原因。
一种解决方案
因此,正如您的代码片段所暗示的那样,很多人将 AndroidActivity
子类中的逻辑放入Screen
BlackBerry 的子类中。它将控制器逻辑与 UI 更紧密地结合在一起,但有时这是可以接受的。
如果您对此感到满意,那么您通常会使用如下简单的代码启动屏幕(活动):
StatusActivity nextScreen = new StatusActivity();
nextScreen.setFirstName(strsessionFirstName);
UiApplication.getUiApplication().pushScreen(nextScreen);
AndroidActivity
在onCreate()
方法中具有的用于检查Intent
附加内容和设置视图的逻辑可能位于StatusActivity
. 如果某些 UI 初始化取决于 的值strsessionFirstName
,那么您可以在setFirstName()
方法中设置该 UI:
状态活动.java:
private LabelField _nameLabel;
public void setFirstName(String value) {
if (_nameLabel == null) {
_nameLabel = new LabelField(value);
add(_nameLabel); // add the new field to the screen
} else {
_nameLabel.setText(value);
}
}
或者,您可以将 firstName 传递给String
构造StatusActivity
函数,然后进行设置。
另一种解决方案
史密斯先生在我上面链接的另一个问题中的建议是为您的所有黑莓“活动”创建一个通用接口,您可以在其中使用键值对设置属性。所以,而不是实施setFirstName()
,你会做
状态活动.java:
private Hashtable _extras = new Hashtable();
private LabelField _nameLabel;
public void putExtra(String name, Object value) {
_extras.put(name, value);
}
// NOTE: this method is private now, and can only be called from inside this class!
private void setFirstName(String value) {
if (_nameLabel == null) {
_nameLabel = new LabelField(value);
add(_nameLabel); // add the new field to the screen
} else {
_nameLabel.setText(value);
}
}
// this overrides a base class method, and is called with the screen is displayed
public void onUiEngineAttached(boolean attached) {
super.onUiEngineAttached(attached);
if (attached) {
String firstName = _extras.get("first_name");
setFirstName(firstName);
}
}
然后你可以这样开始StatusActivity
:
StatusActivity nextScreen = new StatusActivity();
nextScreen.putExtra("first_name", strsessionFirstName);
UiApplication.getUiApplication().pushScreen(nextScreen);