使用Phonegap创建Android服务?(即使关闭了Phonegap应用程序也能运行)

74
我一直在使用PhoneGap开发一款Android应用程序,现在希望能够让应用程序在关闭后仍能执行应用程序中的Java/JS代码。因此,我了解到需要创建一个服务。如果我在PhoneGap上创建一个服务插件,我是否仍然可以执行JavaScript代码或只能执行Java代码?请问有人做过类似的事情吗?我找到了这个讨论,但似乎没有起作用:http://groups.google.com/group/phonegap/browse_thread/thread/722b0e796baa7fc6目前就这些内容。在我尝试以原生方式开发之前,如果我无法解决问题,我想询问是否有人以前已经完成了这项工作。我似乎找不到任何类似的PhoneGap插件。更正:我已经有一个可以执行Java代码的应用程序服务。但是,当它调用sendjavascript时,它却无法工作。那么,在使用PhoneGap关闭应用程序时,是否有办法让JavaScript代码在后台运行?谢谢。

你想在后台运行什么样的代码? - coderslay
我希望能够让JavaScript仍然在后台运行,即使应用程序已关闭,JavaScript仍然可以执行。 - Jonovono
4个回答

55
不,我认为不可能作为服务在后台运行JavaScript代码。 Android上的Phonegap使用一个名为Droidgap的特殊活动,它托管了一个WebView。这个浏览器控件执行JavaScript。这意味着JS执行只能在此活动内部处理,无论它是否可见。
你链接的来自Google Groups的代码试图将一个用Java开发的服务绑定到DroidGap活动中,因此该服务并非用JS编写。
您可以在从DroidGap活动派生的子活动中的JS代码中拥有一些后台活动。例如,在您的活动中有一个后台线程,有一个JS回调函数,让线程调用此回调功能。
如果您真的需要服务,则必须使用本机方式。
更新: JS代码只能在Droidgap活动中执行。活动可以有3种状态(基于Lifecycle of activites):1. 可见;2. 不可见但仍在加载;3. 未加载。
我提供了一个示例,其中我实现了一个Phonegap插件。该插件允许活动将自身注册到SMS_RECEIVED。当活动超出范围时(事件onbeforeunload),它会注销,因此仅处理问题1。
当您想要处理所有3个问题时,您必须将传入的SMS意图转发到活动。当它没有加载时,系统将自动加载和激活活动。但这不再是后台服务,每当接收到短信时,您的应用程序都会变得可见。
如果您不希望这样(如果您真的想要后台服务),则必须提供本地实现。

3
谢谢。如果我理解正确的话,我可以创建一个调用JavaScript回调函数的服务?例如,我可以在Java代码中创建一个服务,当它接收到一条文本消息时,调用一个JavaScript回调函数来执行一些JS代码?那太完美了。我找到了这个插件似乎可以创建一个服务并调用JS代码:https://github.com/awysocki/C2DM-PhoneGap - Jonovono
1
不行,因为当活动关闭时我会注销。根据您的要求,我们需要通过意图唤醒活动,而不需要插件。但是接下来的两天我无法提供示例。 - ChrLipp
1
看起来你在“更新2”中的Github链接已经过时了。 - Mike N
谢谢,我已经删除了这个链接。 - ChrLipp
大家,使用 SharedWorkers 怎么样? - deostroll
显示剩余2条评论

9

这篇文章介绍了如何使用Phonegap在Android上创建服务,提供了一些解决问题的好信息。

它使用了一个很棒的插件,可以轻松地构建一个后台服务。但是你不能使用JS。

我没有找到让JS在后台运行的方法。但是你可以使用该插件在Java和JS之间相互传递参数,这非常有用。虽然你仍需要将JS代码改写成Java代码。

除非你有特殊原因希望只运行JS(但不应该有这种原因...)。

希望这对访问此页面的某些人有用。


请重新发布URL。 - SMKS
请重新发布URL - Ali Hayder
1
可能已经过时了,但我想阅读这篇文章。它在archive.org上:http://web.archive.org/web/20130820140521/http://www.tipsfromsiliconvalley.com/2013/07/06/create-a-service-on-android-with-phonegap-application/ - Jason

4

是的,非常简单...只需安装插件backgroundJS:

https://build.phonegap.com/plugins/430

它允许您在后台运行JavaScript,并与本地通知插件结合使用,甚至可以随时向用户发送通知,但请记住这样做会导致电池更快耗尽,还要考虑到这可能会引起iOS政策问题。祝好运!

1
很不幸,它写着“平台:iOS”,所以它不能在Android上运行 :( - s.krueger
1
以上插件在我的情况下没有无限运行,大约在3分钟左右,后台功能停止了。我尝试将SetBackgroundSeconds方法设置为大约300秒,但也没有起作用,控制台在大约180秒左右停止记录日志。 - Juan Carlos Alpizar Chinchilla
@MichelTobon,你说的“activities”是什么意思?我有一个JS间隔器,根据用户在设置中的选择每X分钟运行一次,但是经过进一步测试,它持续的时间在3-10分钟之间是随机的。也许我做错了什么,你能分享一个关于实现的jsfiddle、gist或类似的链接吗? - Juan Carlos Alpizar Chinchilla
1
@JuanCarlosAlpizarChinchilla 这是代码片段,非常简单http://jsfiddle.net/EJE4R/6/ - Michel Tobon
插件490的问题在于您的应用程序可能会被App Store拒绝:https://github.com/katzer/cordova-plugin-background-mode/issues/77 使用https://github.com/jocull/phonegap-backgroundjs(430基于此)我注意到JS在大约3分钟后停止,因此在```onresume```中,我尝试检查事物是否仍在运行。 - user276648
显示剩余3条评论

2
你可以尝试添加插件cordova-plugin-background-mode,但正如作者所说:
大部分移动操作系统都没有官方支持无限后台任务,因此不符合公共商店供应商的规定。成功提交不能保证。使用该插件需自担风险!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接