1

我试图弄清楚 BlackBerry Java 中“Android Intent”的等价物是什么。我已经阅读了类似的问题/答案,但我一直无法使用它们。一个建议是有一种方法

public class StatusActivity extends MainScreen {

    String strResult;
    String strsessionFirstName;

    public void setResult(String value) {
        strResult = value;
    }
    public void setFirstName(String value) {
        strsessionFirstName = value;
    }

从主类调用,如

if(strResult.equals("credentialaccepted"))
{
    StatusActivity nextScreen = new StatusActivity();
    nextScreen.setFirstName(strsessionFirstName);

但这对我不起作用。使用的其他选项Hashtable,我一直无法理解。任何人都可以用示例代码解释吗?谢谢。

4

1 回答 1

2

我想你已经看过我们对这个问题的回答了?如果没有,请先阅读。

背景

黑莓不使用Intent对象,也没有直接的等价物。在 Android 中,Intent使用对象有不同的原因:

  1. 简单地开始一个Activity
  2. 将调用者与Activity自身Activity分离
  3. 帮助 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子类中的逻辑放入ScreenBlackBerry 的子类中。它将控制器逻辑与 UI 更紧密地结合在一起,但有时这是可以接受的。

如果您对此感到满意,那么您通常会使用如下简单的代码启动屏幕(活动):

StatusActivity nextScreen = new StatusActivity();
nextScreen.setFirstName(strsessionFirstName);
UiApplication.getUiApplication().pushScreen(nextScreen);

AndroidActivityonCreate()方法中具有的用于检查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);
于 2012-07-11T07:22:22.430 回答