目标:我想开发一个运行服务/任务/方法的 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,我无法想象其使用情况。
请建议实现此目标的最佳方法是什么,或建议采用其他更好的方法。
我是黑莓新手所以请原谅我的无知。
答案 0 :(得分:3)
好的研究,很多有趣的想法。
我认为最好的办法是尝试简单的标准方法,只在需要的时候制作更复杂的东西。
以下两个选项被视为“标准”,具有简短的优点和缺点:
a)让你的UiApplication进入后台
当用户按下“关闭”按钮时,您的UiApplication将“requestBackground()”,而不是退出。当用户点击图标时,它会自动被买到前台,或者从任务切换器中选择你的应用程序。然后,您可以随时运行一个线程,或者实际上保持一个运行以更新数据库。
这是我首选的方法。但是你必须小心内存管理,以确保没有泄漏。有些人不喜欢应用程序在Task Switcher上始终可见的想法。
b)替代参赛
使用此选项,您的一个应用程序包包含两个应用程序,或者更准确地说,包含一个应用程序和一个UiApplication。当用户单击图标时,将运行UiApplication。应用程序作为后台任务运行,并更新UiApplication的数据库。
这看起来像是一个更优雅的解决方案,但引入了一些可能的通信问题,并且更难以调试。
在你的情况下,由于你是BB的新手,我建议你使用选项a,如果你发现它不适合你,你就不会觉得交换选项b很困难。
并评论您已提交的选项:
以上是简短的,请询问是否不清楚。 这可能有助于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。请参阅此知识库文章:
关于如何持久保存数据库,我喜欢PersistentStore,因为它存在于所有设备上。但是如果你真的有一个数据库,而不是持久的对象,那么SQLite似乎是理想的选择。我个人不会使用RecordStore,但这里是对选项的讨论:
只是一个澄清 - 在给出的示例中,您有两个应用程序,BgApp和UiApp。您将只有一个main()方法。这个主要方法将使用您指定的args来确定要启动哪个args,它将创建并让它“进入调度程序”。如果我可以提出建议 - 使用“gui”作为参数来指定你将启动你的UiApplication。我遇到过一种情况,操作系统试图用这个String启动我的备用条目Ui应用程序,无论我实际指定了什么。可能是一次性的,但从那以后我一直坚持这样做。
最后两条关于使用Timers和Timertask提供触发事件的评论。要做的第一个注释是你在TimerTask中运行的任何东西都不应该花那么长时间 - 所以你应该只使用TimerTask来启动下载线程(这可能需要很长时间)。其次对我来说,在这种情况下,我不会使用Timer / TimerTask。我宁愿只有一个Thread,它'等待',然后进行处理。对我来说,优势在于它可以是自适应的。例如,如果连接失败,则可能会缩短到下一次连接尝试的时间。或者如果是在下班后,则可能会延长连接之间的时间以减少电池使用量。或者,当电池电量非常低时,您可能会完全停止连接。
希望这有帮助。
答案 1 :(得分:3)
扩展彼得的答案:
您需要创建两个类:
class BgApp extends Applicaton
class UiApp extends UiApplication
我猜你已经创建了扩展UiApplicaiton的类。因此,添加另一个扩展Application的类。
然后创建一个扩展TimerTask并实现其run方法的类来调用更新数据库的方法。
class UpdateDatabaseTask extends TimerTask
在BgApp构造函数中,创建一个Timer。并使用UpdateDatabaseTask
方法安排schedule(TimerTask, long, long)
。
定义备用入口点,选中bgapp入口点的“不在主屏幕上显示”和“启动时自动运行”复选框。
使用内置持久性机制(PersistentStore
和Persistable
接口)来存储数据是最简单和最简单的。即使您使用RecordStore或SQLDb等任何其他方法,UiApp和BgApp都可以使用访问相同的数据库。 ugapp可以访问bgapp更新的值,反之亦然。
如果您想从bgapp向uiapp发送信号(例如,当bgapp下载新数据时,您希望uiapp立即重新加载数据),请在下载时发布全局事件(ApplicationManager.postGlobalEvent()
)已完成,并在显示数据的屏幕(GlobalEventListener
界面)中进行监听。
每个可用的代码示例都可以作为SDK的一部分或在互联网上搜索,你会发现很多实现。