如何在BlackBerry中使用UiApplication.activate()

时间:2013-11-01 06:59:02

标签: blackberry

我想在BlackBerry中使用UiApplication.activate()方法。在Android中,我们使用onResume()方法;那么我们如何在BlackBerry中使用UiApplication.activate()方法?

没有太多可用的信息。

2 个答案:

答案 0 :(得分:4)

由于Peter的回答下面的评论,很难回答这个问题。 Android中的Activity#onResume()通常不会简单地用于“刷新...在进行更改后当场的UI数据”

的Android

当用户(返回)onResume()时,Android操作系统会调用<{Activity;这通常在离开之后发生...要么是因为另一个活动显示在它前面,要么是因为用户离开了你的应用程序并回到它(回家和回来,回到电话和回来等)

enter image description here

黑莓

在BlackBerry中,当用户返回应用时,系统会调用Application#activate()。此回调发生在应用级别。 Android中的应用程序由许多活动(通常)组成。为您的应用中的每个活动分别调用onResume(),因为用户返回该个人活动

虽然不完全相同,但BlackBerry中的类似构造是Screen类。一个应用可能有很多屏幕,因为Android应用程序有很多活动。所以,如果你正在寻找与onResume()最相似的东西,我会尝试,as Peter suggested

要最接近onResume(),您可能需要同时使用这两种方法,因为Screen#onExposed()不会被称为显示Screen第一次时间(虽然Activity#onResume()确实如此)。您可以在扩展Screen(或MainScreen等)的类中覆盖这些方法。

如果您的问题只是确定何时刷新用户界面,则需要详细说明您正在使用哪种UI对象(字段),何时获取新数据显示。

更新

以下是一些示例代码,说明如何构建主Screen类,以尝试模仿Android的onResume()回调:

public final class MyScreen extends MainScreen {
   public MyScreen() {        
      setTitle("MyTitle");
   }

   protected void onExposed() {
      super.onExposed();
      onResume();
   }

   protected void onUiEngineAttached(boolean attached) {
      super.onUiEngineAttached(attached);
      if (attached) {
         onResume();
      }
   }

   private void onResume() {
      // TODO: put your Android-like processing here
      System.out.println("onResume()");
   }
}

答案 1 :(得分:3)

关于activate()没有什么可以了解的。如果你看一下文档

http://www.blackberry.com/developers/docs/7.1.0api/net/rim/device/api/system/Application.html

它说: “当系统将此应用程序带到前台时,系统会调用此方法。”

因此,如果您的应用程序已被推送到后台(例如,通过电话呼叫),然后用户单击您的图标以再次查看您的应用程序,则将调用activate()。相反,当系统将您的应用程序推送到后台时(例如,收到电话时),将调用deactivate()。

请注意,首次启动应用程序时也会调用activate()。

问题实际上是你在onResume()中做了什么,你需要在BlackBerry代码中复制。如果您能告诉我们这一点,我们或许可以建议实现您想要的结果的最佳方式。

<强>更新

鉴于您似乎正在使用onResume()来更新Ui,遗憾的是,没有一种简单的方法可以为整个应用程序执行此操作。您实际使用的方法实际上取决于要更新的​​内容。

但请注意,更改内容时,大多数字段都会自动更新。举一个简单的例子,如果你有一个包含数据的EditField,你就使用了 .setText(“新数据”); 方法,这将自动在屏幕上重新绘制该字段。

我希望您有一个从数据库或数据源填充的屏幕,而在您要刷新此数据的activate()中。因此,您必须浏览每个屏幕的字段并使用关联的set ...方法来更新内容。

这有点问题,因为为应用程序而不是屏幕调用了activate,并且您可能在堆栈上有多个屏幕,并且您确实需要更新所有这些屏幕有多种方法可以执行此操作,包括说,您的屏幕注册自己要更新,或者您的activate()方法在显示堆栈中搜索那里的屏幕。

但可能一个简单的方法是使用每个屏幕的'onExposed()'方法来自动更新内容。在屏幕被隐藏然后显示的任何时候都会调用此方法,这正是应用程序被预设后会发生的情况。当屏幕被另一个被推到屏幕上的屏幕隐藏时,甚至用户按下菜单键也会发生这种情况。因此,如果更新耗时(例如需要数据库查找),您可能不希望每次调用onExposed()时都更新,而是尝试限制更新频率。

这种'onExposed()'方法并没有单独更新每个Field的内容,但它可能更容易实现。

进一步更新

注意Nate的回答,Nate有Android和BB的经验,因此可以更好地解决您的问题。

但是如果您知道屏幕已经更新,那么您刚刚处理了与屏幕内容相关的网络请求,那么您应该单独浏览每个字段,“设置”当时更新的值,不要担心使用onExposed()。一种适用于此的设计方法是将屏幕构造与屏幕填充分开,因此您可以从多个位置调用“填充”(请注意,在更新字段时确实需要在事件线程上)。

但是在这种情况下,您可能会发现创建新屏幕并推送它并弹出旧屏幕(具有旧值)更容易,更快捷。