L'implementazione WebKit Android consente allo sviluppatore di modificare un WebView attraverso la classe android.webkit.WebSettings come
- Supporto per JavaScript,
- Supporto per plugin,
- File System Access,
- ispezione delle risorse ecc.
Ispezione risorse, è possibile esaminare le richieste di contenuto e/o risorse ignorando i metodi shouldOverrideUrlLoading e shouldInterceptRequest.
Ma soprattutto due metodi sono l'uso per scopi diversi, come
1. shouldOverrideUrlLoading
viene chiamato quando una nuova pagina sta per essere aperto, mentre shouldInterceptRequest
viene chiamato ogni volta che una risorsa viene caricato come un file CSS, un js file ecc.
2.Se un utente richiede una risorsa in modo interattivo all'interno di una WebView, è possibile utilizzare il metodo shouldOverrideUrlLoading
della classe WebViewClient
per intercettare la richiesta. Il codice di esempio è presentato di seguito. Source
private class MyWebViewClient extends WebViewClient {
@Override public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (Uri.parse(url).getHost().equals("www.google.com")) {
return true;
}
return false;
}
}
il metodo permette l'applicazione host la possibilità di prendere il controllo quando un nuovo URL sta per essere caricata nella WebView corrente. Un valore restituito di true indica che l'applicazione host gestisce l'URL, mentre return false indica che l'attuale WebView gestisce l'URL. Il codice sopra impedisce che le risorse vengano caricate dall'host "www.google.com".
Tuttavia, il metodo non intercetta il caricamento delle risorse dall'interno, ad esempio da un attributo IFRAME o src all'interno di un tag HTML o SCRIPT, ad esempio. Inoltre XmlHttpRequests non verrebbe nemmeno intercettato. Per intercettare queste richieste è possibile utilizzare il metodo WebViewClient shouldInterceptRequest
. Il codice di esempio è presentato di seguito.
@Override
public WebResourceResponse shouldInterceptRequest(final WebView view, String url) {
if (url.contains(".js")) {
return getWebResourceResponseFromString();
} else {
return super.shouldInterceptRequest(view, url);
}
}
private WebResourceResponse getWebResourceResponseFromString() {
return getUtf8EncodedWebResourceResponse(new StringBufferInputStream("alert('!NO!')"));
}
private WebResourceResponse getUtf8EncodedWebResourceResponse(InputStream data) {
return new WebResourceResponse("text/javascript", "UTF-8", data);
}
Il metodo notifica l'applicazione host di una richiesta di risorsa e consente all'applicazione di restituire i dati. Se il valore restituito è nullo, WebView continuerà a caricare la risorsa come al solito. In caso contrario, verranno utilizzati la risposta di ritorno e i dati. Il codice sopra intercetta richieste di risorse JavaScript (js) e restituisce un avviso al posto della risorsa richiesta.
saperne di più visita: WebViewClient shouldOverrideUrlLoading e shouldInterceptRequest
A quanto pare, shouldOverrideUrlLoading() non viene chiamato quando la loadURL viene chiamato per la prima. Contrariamente alla credenza popolare, shouldOverrideUrlLoading() viene chiamato quando viene fatto clic su qualsiasi collegamento interno dalla pagina Web già caricata. – AnupamChugh