【问题标题】:keepRunning PhoneGap/CordovakeepRunning PhoneGap/Cordova
【发布时间】:2014-01-08 16:39:05
【问题描述】:

任何人都可以向我解释 keepRunning 在 Android 的 config.xml 中是如何工作的。

我的意思是,我不想知道如何编写指令,但它是如何工作的,它如何影响 Android 应用程序的执行?它会在后台创建服务吗?

如果有人能找到我们可以看到它是如何工作的源代码,那就太好了

谢谢。

编辑:我尝试分析生成的代码,分析Android设置中的RAM、服务和进程。我的结论是......什么都不做。 如果您尝试制作一个使用 GPS 跟踪用户的应用程序,请不要使用 Cordova。要正确跟踪用户,您需要使用 START_STICKY 选项创建服务。所以,它在本机代码中。你失去了对 CrossPlatform 的兴趣,因为你必须为所有平台重新编码服务,在我看来,Native Service 和 Cordova App 之间的通信并不容易。

总而言之,如果你使用 Cordova,你必须知道你不能使用所有本地人的力量,你必须做出选择: - 简单的开发(主观)和交叉平台(真的跨平台?) 和 - 本机开发具有强大的功能并且没有兼容性问题,但您必须为一个平台制作一个应用程序

【问题讨论】:

    标签: android cordova android-service


    【解决方案1】:

    我不是 JS/Cordova 开发人员,我是 Android 开发人员。有一次我开发了一个 Cordova 插件,遇到了一些问题并对该主题进行了一些调查。

    keepRunning 标志的一般用途是指示当应用暂停(进入后台)时是否应该停止 JS 计时器。回答您的问题:不,它不会创建任何新的服务。现有的设计在这方面很简单。

    keepRunning 标志在CordovaActivity.java 中定义如下:

    // Keep app running when pause is received. (default = true)
    // If true, then the JavaScript and native code continue to run in the background
    // when another application (activity) is started.
    protected boolean keepRunning = true;
    

    其主要目的是在 Cordova 应用程序暂停时禁用 JS 计时器CordovaWebView.java:

    public void handlePause(boolean keepRunning)
    {
        LOG.d(TAG, "Handle the pause");
        // Send pause event to JavaScript
        this.loadUrl("javascript:try{cordova.fireDocumentEvent('pause');}catch(e){console.log('exception firing pause event from native');};");
    
        // Forward to plugins
        if (this.pluginManager != null) {
            this.pluginManager.onPause(keepRunning);
        }
    
        // If app doesn't want to run in background
        if (!keepRunning) {
            // Pause JavaScript timers (including setInterval)
            this.pauseTimers();
        }
        paused = true;
    
    }
    

    请注意,插件也会通过 PluginManager 得到通知,因此理论上它们可以处理应用暂停事件,在后台停止(或不停止)他们的活动,具体取决于 keepRunning标志。

    在我的情况下,当 keepRunningtrue 时我遇到了问题/错误,但 JS 计时器无论如何都已停止。发生这种情况是因为在CordovaActivity.java 中有与该标志相关的附加功能:

    /**
     * Launch an activity for which you would like a result when it finished. When this activity exits,
     * your onActivityResult() method will be called.
     *
     * @param command           The command object
     * @param intent            The intent to start
     * @param requestCode       The request code that is passed to callback to identify the activity
     */
    public void startActivityForResult(CordovaPlugin command, Intent intent, int requestCode) {
        this.activityResultCallback = command;
        this.activityResultKeepRunning = this.keepRunning;
    
        // If multitasking turned on, then disable it for activities that return results
        if (command != null) {
            this.keepRunning = false;
        }
    
        // Start activity
        super.startActivityForResult(intent, requestCode);
    }
    

    当 Cordova 应用启动另一个 Android 活动时,主要的 Cordova 活动(带有 WebView 的屏幕)进入后台并因此暂停。就我而言,它是通过 Google Maps 插件制作的,该插件通过 Cordova 应用程序启动 GM 屏幕。

    上面的代码关闭了keepRunning标志,这意味着无论keepRunning是真还是假,当被调用的activity出现时(在CordovaActivity.onPause方法中)JS定时器都会停止!

    这看起来像是为某些不清楚(且未记录)的目的而实施的一种技巧,我不知道它的上下文。在我的情况下,它导致了一个错误,我刚刚删除了 startActivityForResult 中的 keepRunning 处理,重新编译了 Cordova,它工作正常。

    添加:关于使用 GPS 服务 - 你说得很对,我同意。作为具有相关 (GPS) 经验的 Android 开发人员,我可以说正确的方法(并且可能是唯一可接受的方法)是为此使用服务。据我所知,Cordova 没有为它提供任何功能,所以我认为它应该通过插件制作。我的意思是您可以为 GPS 功能编写原生 Android 代码(作为服务实现)并从 JS 代码访问它。我相信这是 Cordova 中针对此类情况的常见解决方案。

    【讨论】:

      【解决方案2】:

      完美的答案,对我帮助很大!我正在寻找解决问题的方法 2 天了。

      就我而言,我目前正在开发一个用于登录目的的 cordova 插件。对于登录,我使用在 webview 中加载的外部表单。两天来,我一直在努力解决“忘记密码”链接和我加载的页面上的所有其他链接都在工作的事实,但我无法提交我的表单。只有当我点击后退按钮并完成保存 webview 的意图时,它才会提交并继续。

      事实证明,keepRunning 处理是这里唯一的问题。最后我替换了:`

      cordova.startActivityForResult(this, intent, 0);
      

      作者:

      cordova.setActivityResultCallback(this);
      cordova.getActivity().startActivityForResult(intent, 0);
      

      这基本上完成了 Cordova 的startActivityForResult 的全部工作。唯一遗漏的是整个keepRunninghandling,它首先弄乱了我的插件。

      再次感谢,Mixaz!

      【讨论】:

      • 很好,因为那时您不需要修改 Cordova 的代码。实际上,我在其他一些项目中也使用了相同的方法,但忘记了这一点。我记得那次cordova.startActivityForResult 对我不起作用,可能是因为keepRunning 的问题,但我没有调查那个时间,只是转而直接调用cordova.getActivity().startActivityForResult
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-01
      • 2013-08-04
      相关资源
      最近更新 更多