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

Posted

技术标签:

【中文标题】使用 Phonegap 创建 Android 服务? (即使关闭也可以运行phonegap应用程序)【英文标题】:Creating an Android Service with Phonegap? (Have phonegap app run even when closed) 【发布时间】:2012-05-07 19:12:11 【问题描述】:

我一直在使用 Phonegap 开发一个 android 应用程序,现在想做它,这样当应用程序关闭时,它仍然可以在应用程序中执行 java/js 代码。所以我知道我需要创建一个服务。如果我在 phonegap 上创建服务插件,我还能执行 javascript 代码还是只执行 java?

有人做过这样的事情吗?我发现了这个讨论,但似乎没有用:http://groups.google.com/group/phonegap/browse_thread/thread/722b0e796baa7fc6 这就是我现在所拥有的一切。

在我转向原生开发它之前,如果我想不通,我想问问是否有人以前做过。我似乎找不到任何类似的 phonegap 插件。

编辑:我有一个将 Java 代码作为服务执行的应用程序。但是,当它调用 sendjavascript 时,它不起作用。那么有没有办法让 javascript 代码在使用 phonegap 关闭应用程序时也在后台运行?

谢谢

【问题讨论】:

你想在后台运行什么样的代码? 我希望 javascript 仍然在后台运行。这样即使应用程序关闭,javascript 仍然会被执行。 【参考方案1】:

不,不可能在后台运行 Javascript 代码(至少在我看来)作为服务。 Android 上的 Phonegap 使用一个名为 Droidgap 的特殊活动,它承载一个 WebView。此浏览器控件执行 JavaScript。这意味着JS执行只能在这个activity内部处理,不管它是否可见。

您从 Google Groups 链接的代码尝试将用 Java 开发的服务绑定到 DroidGap 活动,因此该服务不是用 JS 编写的。

您可以在从 DroidGap 活动派生的子活动中的 JS 代码中包含一些后台活动。比如你的activity中有一个后台线程,有一个JS回调函数,让线程调用这个回调函数。

如果你真的需要服务,你必须去本地化。

更新: JS 代码只能通过 Droidgap 活动执行。一个活动可以有3种状态(基于Lifecycle of activites):

    可见 不可见但仍在加载 未加载

我提供了一个sample,在其中我实现了一个Phonegap 插件。该插件允许活动将自己注册到 SMS_RECEIVED。当活动超出范围(事件 onbeforeunload)时,它会取消注册,因此只处理问题 1。

当您希望处理所有 3 个问题时,您必须将传入的 SMS Intent 转发到 Activity。未加载时,系统将自动加载并激活活动。但这不再是后台服务,只要收到短信,您的应用就会变得可见。

如果你不想要这个(如果你真的想要后台服务),你必须提供一个原生实现。

【讨论】:

谢谢。因此,如果我理解的话,我可以创建一个调用 javascript 回调的服务吗?例如,我可以在 Java 代码中有一个服务,当它收到一条文本消息时,它会调用一个 javascript 回调函数来执行一些 JS 代码?那将是完美的。发现这个插件好像是创建服务并调用Js代码:github.com/awysocki/C2DM-PhoneGap 太棒了,这看起来不错。谢谢!因此,如果我在应用程序运行时按下后退按钮,它是否仍应在收到传入文本时写入控制台?好像没有? 不,因为我在活动关闭时注销。根据您的要求,我们必须根据意图唤醒活动,并且我们不需要插件。但我无法在接下来的两天内提供样品。 嗯,好的,谢谢。所以应该没那么难吧?它似乎工作得很好,我只需要它来执行 js 代码。 看起来您在“更新 2”中的 github 链接已过时。【参考方案2】:

this article 介绍了如何使用 Phonegap 在 Android 上创建服务,它为您的问题提供了一些很好的信息。

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

我没有找到让 JS 在后台运行的方法。但是您可以使用插件将参数从 Java 传递给 JS,反之亦然……这非常有用。 不过,您仍然需要用 Java 重写您的 JS 代码。 除非您确实有特定的理由只希望运行 JS? (但不应该……)

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

【讨论】:

请重新发布网址 请转发网址 可能已经过时了,但我想阅读这篇文章。它在archive.org上:web.archive.org/web/20130820140521/http://…【参考方案3】:

是的,而且很简单……只需安装插件backgroundJS:

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

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

【讨论】:

不幸的是,它显示“平台:iOS”,所以它不适用于 Android :( 上述插件在我的情况下没有无限运行,大约 3 分钟,后台功能停止。我尝试将 SetBackgroundSeconds 方法设置为 300 秒左右,但也没有用,控制台在 180 秒左右停止记录。 @Juan Carlos... 对我来说,它工作了大约 6 个小时,然后就搞砸了,重要的是您的应用程序中有活动...我认为这可以解决问题 @MichelTobon 你所说的活动是什么意思?我有一个运行 X 分钟的 js 间隔,具体取决于用户在设置中的选择,但是在进一步测试后,它的持续时间是 3-10 分钟之间的随机时间。也许我做错了什么,你能分享一个关于实现的 jsfiddle、gist 或类似的链接吗? @JuanCarlosAlpizarChinchilla 这是小提琴,真的很简单jsfiddle.net/EJE4R/6【参考方案4】:

您可以尝试添加插件 cordova-plugin-background-mode

但正如作者所说:大多数移动操作系统不支持无限后台任务,因此不符合公共商店供应商的要求。不保证成功提交。 使用插件需要您自担风险!

【讨论】:

以上是关于使用 Phonegap 创建 Android 服务? (即使关闭也可以运行phonegap应用程序)的主要内容,如果未能解决你的问题,请参考以下文章

如何通过android应用程序(使用phonegap/cordova创建)在对服务器进行休息调用时删除原点:file://?

如何使用 Phonegap 创建 Android 应用程序? [复制]

如何使用 phonegap(Android 和 iOS)创建自定义拨号器

使用 jQuery / Phonegap 的肥皂查询在 Android 上总是失败

PhoneGap-Android:Urban Airship 从我的服务器推送通知

Phonegap 状态栏通知,Android,iOS