我有一个Phonegap应用程序,我想在后台运行一些程序。也就是说,在Phonegap活动不可见时执行一些逻辑。目前,我无法编写本机服务来运行这些程序,因此我希望Phonegap Activity本身充当服务。当然,作为服务运行的逻辑是Javascript,不能作为普通的Android服务实现。我想到的一个解决方案是通过生成“虚拟”或空服务(利用startService
和startForeground
)将Phonegap活动视为一种伪服务。我们的想法是,Phonegap Activity的生命周期将与服务的生命周期挂钩,从而继续在后台执行Javascript代码。
无论您是否了解Phonegap,我的问题是:如果我通过在其中生成前台服务来确定流程的优先级,这会影响活动生命周期吗?服务(及其进程)是否可能保持活动状态并且主要活动是否已从内存中清除?
如果无法保证每次发言都会影响活动生命周期,您能否说一下实际可能发生的事情?
答案 0 :(得分:2)
我想到的一个解决方案是通过生成“虚拟”或空服务(利用startService和startForeground)将Phonegap活动视为一种伪服务。
如果可以这样做,您可以在本机Java代码中实现实际服务(而不仅仅是在本机Java代码中编写空服务),并且可以避免所有这些无意义。
我们的想法是,Phonegap Activity的生命周期将与服务的生命周期相关联,从而继续在后台执行Javascript代码。
AFAIK,WebView
既不知道也不关心过程中是否有Service
。当WebView
不可见时,无法保证WebView
将无限期地继续执行JavaScript。而且,由于您的PhoneGap应用程序几乎只是一个WebView
,因此您依赖的是这种未记录的WebView
行为。
如果我通过在其中生成前台服务来确定流程的优先级,这会影响活动生命周期吗?服务(及其进程)是否可能保持活动状态并且主要活动是否已从内存中清除?
欢迎用户按下BACK按钮,销毁您的活动,不受您是否开始提供服务的影响。
欢迎用户使用任务管理器(例如Android 4.0+上的最新任务列表)来关闭后台进程,这不受您是否启动某项服务的影响。
欢迎用户通过“设置”强制停止您的应用,以防止您的代码在未经他们许可的情况下再次运行,并且不受您是否启动某项服务的影响。
欢迎操作系统自行终止您的流程 - startForeground()
不是终身通行证。
所有这一切,在后三种情况下,活动和服务将在此过程中同时消失。只有BACK按钮(或您的呼叫finish()
或某些未处理的异常)才会导致活动消失但服务仍然存在。
答案 1 :(得分:1)
CommonsWare给出了一个很好的综合答案。我想用我的经验来增强它。
是的,产生虚拟服务并且可靠地调用startForeground()
使我的应用程序在后台运行。我和我的几个用户从未见过操作系统自行杀死了应用程序。
但是,每次我手动终止活动(从“最近”中滑出)时,服务也会停止。虽然,在PhoneGap的背景下,它看起来很合乎逻辑。
此外,使用PhoneGap,您可以按this answer中所述覆盖后退按钮的行为。