diff options
author | Christian Strømme <christian.stromme@digia.com> | 2014-08-27 17:49:17 +0200 |
---|---|---|
committer | Christian Stromme <christian.stromme@digia.com> | 2014-09-05 16:11:21 +0200 |
commit | c08eef29b45646643535e917f70492727160720b (patch) | |
tree | ddcdeca1bf7481cda73a70f0aa7d72e076824c08 | |
parent | da4a9b5deb8200621753252bc742702964ebf801 (diff) |
Android: Call onResume() and onPause() when the application is paused.
To avoid unnecessary resource usage we should call onPause() and
onResume() on the WebView when the application state changes to avoid
unnecessary resource usage.
Change-Id: I31bf37f8b13e8f9da65a7a6c616c536456c5bea2
Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@digia.com>
-rw-r--r-- | src/jar/src/org/qtproject/qt5/android/view/QtAndroidWebViewController.java | 36 | ||||
-rw-r--r-- | src/webview/qwebview_android.cpp | 20 | ||||
-rw-r--r-- | src/webview/qwebview_android_p.h | 3 |
3 files changed, 57 insertions, 2 deletions
diff --git a/src/jar/src/org/qtproject/qt5/android/view/QtAndroidWebViewController.java b/src/jar/src/org/qtproject/qt5/android/view/QtAndroidWebViewController.java index 037b0ad..84068fc 100644 --- a/src/jar/src/org/qtproject/qt5/android/view/QtAndroidWebViewController.java +++ b/src/jar/src/org/qtproject/qt5/android/view/QtAndroidWebViewController.java @@ -47,6 +47,8 @@ import android.util.Log; import android.webkit.WebSettings.PluginState; import android.graphics.Bitmap; import java.util.concurrent.Semaphore; +import java.lang.reflect.Method; +import android.os.Build; public class QtAndroidWebViewController { @@ -54,6 +56,11 @@ public class QtAndroidWebViewController private final long m_id; private WebView m_webView = null; private static final String TAG = "QtAndroidWebViewController"; + + // API 11 methods + private Method m_webViewOnResume = null; + private Method m_webViewOnPause = null; + // Native callbacks private native void c_onPageFinished(long id, String url); private native void c_onPageStarted(long id, String url, Bitmap icon); @@ -135,6 +142,13 @@ public class QtAndroidWebViewController } catch (Exception e) { e.printStackTrace(); } + + if (Build.VERSION.SDK_INT > 10) { + try { + m_webViewOnResume = m_webView.getClass().getMethod("onResume"); + m_webViewOnPause = m_webView.getClass().getMethod("onPause"); + } catch (Exception e) { /* Do nothing */ e.printStackTrace(); } + } } public void loadUrl(final String url) @@ -249,4 +263,26 @@ public class QtAndroidWebViewController { return m_webView; } + + public void onPause() + { + if (m_webViewOnPause == null) + return; + + m_activity.runOnUiThread(new Runnable() { + @Override + public void run() { try { m_webViewOnPause.invoke(m_webView); } catch (Exception e) { e.printStackTrace(); } } + }); + } + + public void onResume() + { + if (m_webViewOnResume == null) + return; + + m_activity.runOnUiThread(new Runnable() { + @Override + public void run() { try { m_webViewOnResume.invoke(m_webView); } catch (Exception e) { e.printStackTrace(); } } + }); + } } diff --git a/src/webview/qwebview_android.cpp b/src/webview/qwebview_android.cpp index 81cedb3..8ea891d 100644 --- a/src/webview/qwebview_android.cpp +++ b/src/webview/qwebview_android.cpp @@ -41,9 +41,12 @@ #include <QtQuick/qquickitem.h> #include <QtCore/qmap.h> #include <android/bitmap.h> +#include <QtGui/qguiapplication.h> QT_BEGIN_NAMESPACE +static const char qtAndroidWebViewControllerClass[] = "org/qtproject/qt5/android/view/QtAndroidWebViewController"; + QWebViewPrivate *QWebViewPrivate::create(QWebView *q) { return new QAndroidWebViewPrivate(q); @@ -73,13 +76,15 @@ QAndroidWebViewPrivate::QAndroidWebViewPrivate(QWebView *q) : QWebViewPrivate(q) , m_id(reinterpret_cast<quintptr>(this)) { - m_viewController = QAndroidJniObject("org/qtproject/qt5/android/view/QtAndroidWebViewController", + m_viewController = QAndroidJniObject(qtAndroidWebViewControllerClass, "(Landroid/app/Activity;J)V", QtAndroid::androidActivity().object(), m_id); m_webView = m_viewController.callObjectMethod("getWebView", "()Landroid/webkit/WebView;"); g_webViews->insert(m_id, this); + connect(qApp, &QGuiApplication::applicationStateChanged, + this, &QAndroidWebViewPrivate::onApplicationStateChanged); } QAndroidWebViewPrivate::~QAndroidWebViewPrivate() @@ -134,6 +139,17 @@ void *QAndroidWebViewPrivate::nativeWebView() const return m_webView.object(); } +void QAndroidWebViewPrivate::onApplicationStateChanged(Qt::ApplicationState state) +{ + if (QtAndroid::androidSdkVersion() < 11) + return; + + if (state == Qt::ApplicationActive) + m_viewController.callMethod<void>("onResume"); + else + m_viewController.callMethod<void>("onPause"); +} + QT_END_NAMESPACE static void c_onPageFinished(JNIEnv *env, @@ -243,7 +259,7 @@ JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* /*reserved*/) JNIEnv *jniEnv = uenv.nativeEnvironment; - jclass clazz = jniEnv->FindClass("org/qtproject/qt5/android/view/QtAndroidWebViewController"); + jclass clazz = jniEnv->FindClass(qtAndroidWebViewControllerClass); if (!clazz) return JNI_ERR; diff --git a/src/webview/qwebview_android_p.h b/src/webview/qwebview_android_p.h index 1ab2709..761881a 100644 --- a/src/webview/qwebview_android_p.h +++ b/src/webview/qwebview_android_p.h @@ -77,6 +77,9 @@ public Q_SLOTS: void goForward() const; void stopLoading() const; +private Q_SLOTS: + void onApplicationStateChanged(Qt::ApplicationState state); + private: quintptr m_id; QAndroidJniObject m_viewController; |