2

目标:我想开发一个UI 应用程序,它定期运行服务/任务/方法 来更新数据库。即使我的应用程序不活动/可见/用户退出应用程序,该服务也应该定期启动。类似于Android 服务

我正在使用 BlackBerry Java 7.1 SDK eclipse 插件。

我遇到的选项如下:

1)如何在后台运行黑莓应用程序

此链接建议我扩展Application而不是UIApplication. 但我不能这样做,因为我的应用程序有一个用户界面

2)使应用程序进入后台

我不希望我的 UI 应用程序进入后台,而是希望我的应用程序定期调用该服务。

3)从黑莓的 MainScreen 运行后台任务?

这个链接建议我运行一个线程,但我不认为如果用户退出我的应用程序,那么线程将在后台运行

4) Blackberry 从 UI 应用程序安装后台服务?

这建议使用 CodeModuleManager ,我无法确定其用法。

请提出实现这一目标的最佳方法或建议任何其他更好的方法。

我是黑莓新手,请原谅我的无知。

4

2 回答 2

3

扩展彼得的答案:

  1. 您将需要创建两个类:

    class BgApp extends Applicaton
    class UiApp extends UiApplication
    

    我猜你已经创建了扩展 UiApplicaiton 的类。所以添加另一个扩展应用程序的类。

  2. 然后创建一个扩展 TimerTask 的类,并实现它的 run 方法来调用更新数据库的方法。

    class UpdateDatabaseTask extends TimerTask
    
  3. 在 BgApp 构造函数中,创建一个 Timer。并安排UpdateDatabaseTask使用该schedule(TimerTask, long, long)方法。

  4. 定义备用入口点,选中 bgapp 入口点的“不显示在主屏幕上”和“启动时自动运行”复选框。

  5. PersistentStore使用内置的持久性机制(和Persistable接口)来存储数据是最简单和最简单的。即使您使用任何其他方式,如 RecordStore 或 SQLDb,UiApp 和 BgApp 都可以使用访问同一个数据库。由 bgapp 更新的值将由 uiapp 自动访问,反之亦然。

  6. 如果您想从 bgapp 向 uiapp 发送信号(例如,当 bgapp 下载新数据时,您希望 uiapp 立即重新加载数据),ApplicationManager.postGlobalEvent()请在下载完成时发布一个全局事件 ( ) 并在屏幕上监听它显示数据(GlobalEventListener界面)。

作为 SDK 的一部分,每个都有代码示例,或者在 Internet 上搜索,您会发现很多实现。

于 2013-08-18T18:07:33.610 回答
3

很好的研究,很多有趣的想法。

我认为最好的办法是尝试简单的标准方法,并且只在需要时制作更复杂的东西。

以下是两个被视为“标准”的选项,具有简要的优点和缺点:

a) 让你的 UiApplication 进入后台

当用户按下“关闭”按钮时,您的 UiApplication 不会退出,而是“requestBackground()”。当用户单击图标或从任务切换器中选择您的应用程序时,它将自动被购买到前台。然后,您可以随时运行一个线程,或者实际上让一个线程运行以更新数据库。

这是我的首选方法。但是您必须小心内存管理以确保没有泄漏。有些人不喜欢应用程序始终在任务切换器上可见的想法。

b) 备用条目

使用此选项,您的一个应用程序包包含两个应用程序,或者更准确地说,一个应用程序和一个 UiApplication。UiApplication 在用户单击图标时运行。应用程序作为后台任务运行,并为您的 UiApplication 更新数据库。

这看起来像一个更优雅的解决方案,但引入了一些可能的通信问题,并且更难以调试。

在你的情况下,由于你对BB比较陌生,我建议你使用选项a,如果你发现它不适合你,你会发现切换到选项b并不难。

并评论您已经提出的选项:

  1. 有点被选项 b 覆盖
  2. 选项一
  3. 你是对的 - 如果应用程序退出,所有线程都被杀死
  4. 留下首先创建应用程序然后调试它的问题。这对您来说并不是真正的解决方案,而是一种实现方法。

以上是简要的,不清楚的请追问。这可能对 b 有所帮助:http: //supportforums.blackberry.com/t5/Java-Development/Set-up-an-alternate-entry-point-for-an-application/ta-p/444847

编辑:

对此进行编辑以回答问题并扩展替代答案,该答案在此基础上进行了扩展(我知道有点循环......)。

要首先回答第二个问题,我同意另一个答案,即备用条目(背景)和前台应用程序可以共享 SQLite 数据库。

关于这两个如何通信,虽然它们工作得很好,但我个人不是全局事件的忠实粉丝,因为它们会传播到 BlackBerry 上的所有应用程序。您可以通过许多替代方式来实现类似的事情 - 诀窍是找到两个应用程序共有的东西,以便它们可以通信。为此,我推荐使用 RuntimeStore。请参阅此知识库文章:

http://supportforums.blackberry.com/t5/Java-Development/Create-a-singleton-using-the-RuntimeStore/ta-p/442854

关于如何持久化数据库,我喜欢 PersistentStore,因为它存在于所有设备上。但是如果你真的有一个数据库,而不是持久对象,那么 SQLite 似乎是理想的选择。我个人不会使用 RecordStore,但这里是对选项的讨论:

http://supportforums.blackberry.com/t5/Java-Development/Introduction-to-Persistence-Models-on-BlackBerry/ta-p/446810

只是澄清一下 - 在给出的示例中,您有两个应用程序,BgApp 和 UiApp。您将只有一个 main() 方法。这个主要方法将使用您指定的参数来确定要启动哪个参数,它将创建哪个参数并让它“进入调度程序”。如果我可以提出建议 - 使用“gui”作为参数来指定您将启动 UiApplication。我遇到过这样的情况,即操作系统尝试使用此字符串启动我的备用条目 Ui 应用程序,而不管我实际指定了什么。可能是一次性的,但从那以后我一直坚持这样做。

最后,关于使用 Timers 和 Timertask 提供触发事件的两个评论。首先要评论的是您在 TimerTask 中运行的任何内容都不应该花那么长时间 - 所以您应该只使用 TimerTask 来启动下载线程(这可能需要很长时间)。其次对我来说,在这种情况下,我不会使用 Timer/TimerTask。我宁愿只有一个线程,它“等待”,然后处理。对我来说的好处是这可以是自适应的。例如,如果您无法连接,那么您可能会缩短到下一次连接尝试的时间。或者如果是下班后,那么您可能会延长连接之间的时间以减少电池使用量。或者,当电池电量非常低时,您可能会完全停止连接。

希望这可以帮助。

于 2013-08-13T13:33:23.507 回答