在java黑莓中运行定期后台服务的最佳方法

时间:2013-08-13 10:16:55

标签: service blackberry blackberry-eclipse-plugin blackberry-jde

目标:我想开发一个运行服务/任务/方法的 UI应用程序 定期更新数据库。此服务应该在之后开始 即使我的应用程序不活动/可见/用户退出,也会定期 应用程序。与an Android Service类似。

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

我遇到的选项如下:

1)How to run BlackBerry application in Background

此链接表明我延长Application而不是UIApplication。但我无法做到这一点,因为我的应用程序具有用户界面

2)Make application go in background

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

3)Run background task from MainScreen in BlackBerry?

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

4)Blackberry Install background service from UI application?

这建议使用CodeModuleManager,我无法想象其使用情况。

请建议实现此目标的最佳方法是什么,或建议采用其他更好的方法。

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

2 个答案:

答案 0 :(得分:3)

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

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

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

a)让你的UiApplication进入后台

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

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

b)替代参赛

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

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

在你的情况下,由于你是BB的新手,我建议你使用选项a,如果你发现它不适合你,你就不会觉得交换选项b很困难。

并评论您已提交的选项:

  1. 用选项b
  2. 覆盖的排序
  3. 选项a
  4. 你是对的 - 如果一个应用程序退出,所有线程都被杀死
  5. 首先解决了创建应用程序的问题,然后进行调试。这不是一个真正的解决方案,更多的是一种实现方法。
  6. 以上是简短的,请询问是否不清楚。 这可能有助于b: http://supportforums.blackberry.com/t5/Java-Development/Set-up-an-alternate-entry-point-for-an-application/ta-p/444847

    编辑:

    对此进行编辑以回答问题并扩展替代答案,该答案扩展到了这个问题上(我知道......)。

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

    关于这两者如何沟通,虽然它们工作得很好,但我个人并不是Global Events的忠实粉丝,因为它们会传播到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()方法。这个主要方法将使用您指定的args来确定要启动哪个args,它将创建并让它“进入调度程序”。如果我可以提出建议 - 使用“gui”作为参数来指定你将启动你的UiApplication。我遇到过一种情况,操作系统试图用这个String启动我的备用条目Ui应用程序,无论我实际指定了什么。可能是一次性的,但从那以后我一直坚持这样做。

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

    希望这有帮助。

答案 1 :(得分:3)

扩展彼得的答案:

  1. 您需要创建两个类:

    class BgApp extends Applicaton
    class UiApp extends UiApplication
    

    我猜你已经创建了扩展UiApplicaiton的类。因此,添加另一个扩展Application的类。

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

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

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

  5. 使用内置持久性机制(PersistentStorePersistable接口)来存储数据是最简单和最简单的。即使您使用RecordStore或SQLDb等任何其他方法,UiApp和BgApp都可以使用访问相同的数据库。 ugapp可以访问bgapp更新的值,反之亦然。

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

  7. 每个可用的代码示例都可以作为SDK的一部分或在互联网上搜索,你会发现很多实现。