@sergiandreplace
• I do Android stuff
• I’ve tried to create something
with webviews
• It was a monster
• Pain and tears
•...
@sergiandreplace
• “A view that displays web pages”
• Since API 1
• New version in KitKat (not today)
• Is not based on Ch...
@sergiandreplace
• WebView is added to a layout like any other view
• It’s a wrapper to execute html and associated
techno...
@sergiandreplace
@sergiandreplace
• WebSettings settings=webView.getSettings()
• settings.
• setJavaScriptEnabled
• setGeolocationEnabled
•...
@sergiandreplace
• Default behaviour: open links externally (yes, it’s true)
• We should intercept the url requests and re...
@sergiandreplace
@sergiandreplace
• WebViewClient handles page lifecycle and resources loading
• .onPageFinished (it’s a trap!)
• .onPageSt...
@sergiandreplace
• Android fragmentation is nothing compared to this
• Video full screen is handled by WebChromeClient.onS...
@sergiandreplace
• Just put your web on assets and
load it
• loadUrl("file:///android_asset/...
(///!!!)
• Java vs. Javasc...
@sergiandreplace
@sergiandreplace
• We can inject Java objects to the WebView
• This object methods can be invoked from JavaScript
• Cool, ...
@sergiandreplace
• Just use a specific url format and capture it from WebViewClient
and Use url to put parameters
• This w...
@sergiandreplace
@sergiandreplace
• Only one possible solution
• loadUrl(“javascript:….”);
• End of it
@sergiandreplace
@sergiandreplace
• Bug http://code.google.com/p/android/issues/detail?id=17535:Url with params not
working
• Sony (des)Exp...
@sergiandreplace
• Questions and all the stuff
Android webviews and Hybrid Development. A Horror Story
Próxima SlideShare
Cargando en…5
×

Android webviews and Hybrid Development. A Horror Story

4.232 visualizaciones

Publicado el

Introduction to the Android WebView and fundamentals of Hybrid Development. Find the sample code at https://github.com/sergiandreplace/webview_samples

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 http://code.google.com/p/android/issues/detail?id=17535:Url 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

×