4

我有一个 Phonegap 应用程序,我想在后台运行一些程序。也就是说,在 Phonegap Activity 不可见时执行一些逻辑。目前,我无法编写本机服务来运行这些程序,因此我希望 Phonegap Activity 本身充当服务。当然,作为Service运行的逻辑是Javascript,不能作为普通的Android Service来实现。startService我想到的一个解决方案是通过生成一个“虚拟”或空服务(利用and )将 Phonegap Activity 视为一种伪服务startForeground。这个想法是 Phonegap Activity 的生命周期将与服务的生命周期相关联,因此将继续在后台执行 Javascript 代码。

不管你是否知道Phonegap,我的问题是:如果我通过在其中生成前台服务来对进程进行优先级排序,这会影响Activity 生命周期吗?服务(及其进程)是否有可能保持活动状态并且主 Activity 从内存中清除?

如果不能保证 Activity 生命周期会受到影响,你能谈谈实践中可能发生的事情吗?

4

2 回答 2

2

我想到的一个解决方案是通过生成“虚拟”或空服务(利用 startService 和 startForeground)将 Phonegap Activity 视为一种伪服务。

如果你能做到这一点,你就可以用原生 Java 代码实现实际的服务(而不是仅仅用原生 Java 代码编写一个空的服务),你就可以避免所有这些废话。

这个想法是 Phonegap Activity 的生命周期将与服务的生命周期相关联,因此将继续在后台执行 Javascript 代码。

AFAIK,WebView既不知道也不关心过程中是否存在Service。无法保证在不可见WebView时会无限期地继续执行 JavaScript 。WebView而且,由于您的 PhoneGap 应用程序几乎只是一个,因此您所依赖的WebView正是这种未记录的行为。WebView

如果我通过在其中生成前台服务来确定进程的优先级,这会影响 Activity 生命周期吗?服务(及其进程)是否有可能保持活动状态并且主 Activity 从内存中清除?

欢迎用户按下 BACK 按钮,破坏您的活动,并且不受您是否启动某些服务的影响。

欢迎用户使用任务管理器(例如,Android 4.0+ 上的最近任务列表)来关闭您的后台进程,这不受您是否启动某些服务的影响。

欢迎用户通过设置强制停止您的应用程序,以防止您的代码在未经他们许可的情况下再次运行,并且不受您是否启动某些服务的影响。

欢迎操作系统自行终止您的进程——startForeground()这不是终身通行证。

话虽如此,在后三种情况下,当流程发生时,活动和服务将同时消失。只有 BACK 按钮(或您的调用finish(),或一些未处理的异常)会导致活动消失但服务仍然存在。

于 2012-09-01T12:01:02.287 回答
1

CommonsWare 给出了很好的综合回答。我想用我的经验来补充它。

是的,产生一个虚拟服务并startForeground()可靠地调用让我的应用程序在后台运行。我和我的少数用户从未见过操作系统自行杀死了该应用程序。

但是,每次我手动终止活动(从“最近”中将其刷出)时,该服务也会停止。不过,在 PhoneGap 的上下文中,它看起来很合乎逻辑。

此外,使用 PhoneGap,您可以覆盖此答案中所述的后退按钮行为。

于 2013-02-12T08:56:40.127 回答