Se ha denunciado esta presentación.
Utilizamos tu perfil de LinkedIn y tus datos de actividad para personalizar los anuncios y mostrarte publicidad más relevante. Puedes cambiar tus preferencias de publicidad en cualquier momento.

Android webviews and Hybrid Development. A Horror Story

4.447 visualizaciones

Publicado el

Introduction to the Android WebView and fundamentals of Hybrid Development. Find the sample code at

Publicado en: Tecnología
  • Sé el primero en comentar

Android webviews and Hybrid Development. A Horror Story

  1. 1. @sergiandreplace • I do Android stuff • I’ve tried to create something with webviews • It was a monster • Pain and tears • This is my history
  2. 2. @sergiandreplace • “A view that displays web pages” • Since API 1 • New version in KitKat (not today) • Is not based on Chrome • Renderer is “special” • Its full of bugs and issues
  3. 3. @sergiandreplace • WebView is added to a layout like any other view • It’s a wrapper to execute html and associated technologies • The Java environment and the html environment are isolated* • We can: • loadUrl(String url) • loadData(String data, String mime, String encoding) • loadDataWithBaseUrl (String baseUrl. String data….) • android.permission.INTERNET!! Android app Webview HTML (JS, CSS, etc) Java
  4. 4. @sergiandreplace
  5. 5. @sergiandreplace • WebSettings settings=webView.getSettings() • settings. • setJavaScriptEnabled • setGeolocationEnabled • setJavaScriptCanOpenWindowsAutomatically • setBuiltInZoomControls
  6. 6. @sergiandreplace • Default behaviour: open links externally (yes, it’s true) • We should intercept the url requests and redirect back to the webview • We need a WebViewClient • WebViewClient handles page events
  7. 7. @sergiandreplace
  8. 8. @sergiandreplace • WebViewClient handles page lifecycle and resources loading • .onPageFinished (it’s a trap!) • .onPageStarted • .shouldInterceptRequest (ooooh!) • WebChromeClient Just handles “other” events. More specific to page itself* . • .onProgressChanged (what the…?)
  9. 9. @sergiandreplace • Android fragmentation is nothing compared to this • Video full screen is handled by WebChromeClient.onShowCustomView • Android <=2.3.3  view instanceof VideoView • Android >3.0  view instanceof HTML5VideoView . An internal private class (d’oh!) Field proxiedVideoFullScreen = callback.getClass().getDeclaredFields()[0]; proxiedVideoFullScreen.setAccessible(true); Object unproxiedVideoFullScreen=proxiedVideoFullScreen.get(callback); Field mUri= unproxiedVideoFullScreen.getClass().getSuperclass().getDeclaredField("mUri"); mUri.setAccessible(true); path =((Uri)mUri.get(unproxiedVideoFullScreen)).toString();
  10. 10. @sergiandreplace • Just put your web on assets and load it • loadUrl("file:///android_asset/... (///!!!) • Java vs. Javascript.Try to be as biased as possible • Do not mix interactive events (touch, drag, etc)
  11. 11. @sergiandreplace
  12. 12. @sergiandreplace • We can inject Java objects to the WebView • This object methods can be invoked from JavaScript • Cool, isn’t? So cool that nobody else supports it • Forget DODM! • Sooo…
  13. 13. @sergiandreplace • Just use a specific url format and capture it from WebViewClient and Use url to put parameters • This works in all platforms • Uri class is our best friend for parsing urls • Returning values? Add callback function as parameter. All calls are asynchronous • Basically, this is what Cordova does
  14. 14. @sergiandreplace
  15. 15. @sergiandreplace • Only one possible solution • loadUrl(“javascript:….”); • End of it
  16. 16. @sergiandreplace
  17. 17. @sergiandreplace • Bug with params not working • Sony (des)Experia • Create a mini-browser to the web team. Don’t relay on Chrome for Android • Abandon Android 3.0. Seriously. • Do a lot of tests • Hardware acceleration:“If your application performs custom drawing, test your application on actual hardware devices with hardware acceleration turned on to find any problems” a.k.a.: Just try
  18. 18. @sergiandreplace • Questions and all the stuff