You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@cordova.apache.org by "hugefactory (JIRA)" <ji...@apache.org> on 2015/01/30 10:38:38 UTC

[jira] [Created] (CB-8383) pause event don't fire when 'KeepRunning' is false

hugefactory created CB-8383:
-------------------------------

             Summary: pause event don't fire when 'KeepRunning' is false
                 Key: CB-8383
                 URL: https://issues.apache.org/jira/browse/CB-8383
             Project: Apache Cordova
          Issue Type: Bug
          Components: Android
    Affects Versions: 3.5.0, Master, 4.0.0, 4.1.3
         Environment: Mac osx 10.9
            Reporter: hugefactory


When a project use 'KeepRunning=false' in the config.xml file, the 'pause' event in javascript don't fire when application go to background. Next, 'pause' event fire when 'resume' is call and when the application resume.
The problem is in 'CordovaWebView.java' in the 'handlePause' method :

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;
   
    }

As you can see, 'pauseTimers()' is call immediatly when we choose 'KeepRunning' false.
According to the Android documentation, 'pauseTimer()' stop all javascript activity....then the 'pause' javascript callback is not execute (it's execute after, when the 'resumeTimers()' is call and the application resume.

I suggest to delay the 'pauseTimers()' for 1 or 2 sec. Then the javascript 'pause' can execute before the application is really stop :

//OLD       
     //this.pauseTimers();

//NEW
            final Handler handler = new Handler();
            handler.postDelayed(new Runnable() {
              @Override
              public void run() {
                LOG.d(TAG, "Handle the pauseTimers");
                pauseTimers();
              }
            }, 1000);
        }

Thanks.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

---------------------------------------------------------------------
To unsubscribe, e-mail: issues-unsubscribe@cordova.apache.org
For additional commands, e-mail: issues-help@cordova.apache.org