2.攔截WebView事件
2.1 問題
應用程式使用WebView顯示內容,但在使用者點選頁面中的連結時還需要監聽和響應。
2.2 解決方案
(API Level 1)
實現一個WebViewClient並把它關聯到WebView上。WebViewClient和WebChromeClient是兩個WebKit類,它們可以讓應用程式獲得WebView的事件回撥並且可以自定義WebView的行為。預設情況下,在沒有指定WebViewClient時,WebView會將一個URL傳遞給ActivityManager處理。而ActivityManager通常會在瀏覽器應用程式中開啟使用者點選的連結,而不是當前的WebView中。
2.3 實現機制
在程式碼清單中,可建立一個含有WebView的Activity,該WebView將處理它自己的URL載入。
帶有一個WebView的Activity的Activity,該WebView會處理URL
public class MyActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
WebView webview = new WebView(this);
webview.getSettings().setJavaScriptEnabled(true);
//新增一個客戶端到檢視上
webview.loadUrl("http://www.baidu.com/");
setContentView(webview);
}
}
在本例中,只是簡單地為WebView提供了一個單純功能的WebViewClient,它可以讓WebView自己處理所有的URL請求,而不是將這些請求傳遞給ActivityManager,因此點選一個連結會在原來的檢視中載入請求的頁面,這是因為shouldOverrideUrlLoading()的預設實現會簡單地返回false,告訴客戶端將URL傳遞給WebView而不是應用程式。
在下一個示例中,我們將利用WebViewClient.shouldOverrideUrlLoading()回撥來攔截和監控使用者的Activity(參見以下程式碼清單)。
攔截WebView URL的Activity
public class MyActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
WebView webview = new WebView(this);
webview.getSettings().setJavaScriptEnabled(true);
//新增一個客戶端到檢視上
webView.setWebViewClient(mClient);
webview.loadUrl("http://www.baidu.com/");
setContentView(webview);
}
private WebViewClient mClient = new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
Uri request = Uri.parse(url);
if (TextUtils.equals(request.getAuthority(),"www.baidu.com")){
//允許載入
return false;
}
Toast.makeText(MyActivity.this,"Sorry,buddy",Toast.LENGTH_SHORT).show();
return true;
}
};
}
在本例中,shouldOverrideUrlLoading()會根據傳入的URL決定使用是否要在WebView中載入內容,防止使用者離開百度的網站。Uri.getAuthority()會返回一個URL的主機域名部分,我們會使用它檢測使用者點選的連結是否是百度的域名(www.baidu.com)。如果能夠確認連結指向的是百度的其他頁面,會返回false,從而允許WebView載入內容。如果不是,會通知使用者並返回true,然後通知WebViewClient應用程式已經處理了這個URL,不允許WebView載入它。
這項技術還能變得更加複雜,應用程式可以對URL做各種實際處理。通過自定義的處理方式,還可以在應用程式和WebView的內容之間打造一個完整的互動介面。
相關文章
- Flutter下實現WebView攔截載入離線資源FlutterWebView
- Proxy 攔截
- SpringMVC攔截器,設定不攔截的URLSpringMVC
- 前端架構之vue+axios 前端實現登入攔截(路由攔截、http攔截)前端架構VueiOS路由HTTP
- Spring MVC 中的攔截器的使用“攔截器基本配置” 和 “攔截器高階配置”SpringMVC
- SpringMVC攔截器SpringMVC
- axios 攔截器iOS
- spring攔截器Spring
- axios攔截器iOS
- sql攔截器SQL
- 導彈攔截
- Mybatis 攔截器MyBatis
- MyBatis攔截器MyBatis
- win10 microsoft edge網址被攔截如何取消攔截Win10ROS
- Xposed攔截抽象方法抽象
- Mybatis Interceptor 攔截器MyBatis
- WKCrashSDK - crash攔截工具
- spring boot 攔截器Spring Boot
- SpringMVC-攔截器SpringMVC
- gRPC(3):攔截器RPC
- 【SpringMVC】 4.3 攔截器SpringMVC
- SpringBoot攔截器中獲取註解、攔截器中注入ServiceSpring Boot
- Asp.Netcore使用Filter來實現介面的全域性異常攔截,以及前置攔截和後置攔截ASP.NETNetCoreFilter
- Flume內建攔截器與自定義攔截器(程式碼實戰)
- Spring Boot新增攔截器Spring Boot
- SpringBoot 手寫攔截器Spring Boot
- HandlerInterceptor - 自定義攔截器
- 攔截過濾器模式過濾器模式
- mybatis註冊攔截器MyBatis
- 16、threadlocal+攔截器thread
- SpringMVC中的攔截器SpringMVC
- grpc中的攔截器RPC
- 短視訊直播系統,軟體自帶的攔截器,攔截功能
- Springboot通過攔截器攔截請求資訊收集到日誌Spring Boot
- spring mvc攔截器,spring攔截器以及AOP切面的區別和原始碼SpringMVC原始碼
- 從程式設計攔截器到大腦資訊攔截處理架構程式設計架構
- 微信域名攔截檢測
- P1254 導彈攔截