ใช้ WebView เพื่อแสดงเว็บแอปพลิเคชันหรือหน้าเว็บเป็นส่วนหนึ่งของแอปไคลเอ็นต์ คลาส WebView เป็นส่วนขยายของคลาส View ของ Android ที่ช่วยให้คุณแสดงหน้าเว็บเป็นส่วนหนึ่งของเลย์เอาต์กิจกรรมได้ แต่จะไม่มีฟีเจอร์ของเว็บเบราว์เซอร์ที่พัฒนาขึ้นอย่างเต็มรูปแบบ เช่น ตัวควบคุมการนำทางหรือแถบที่อยู่ โดยค่าเริ่มต้น สิ่งที่ WebView ทำคือแสดงหน้าเว็บ
WebView ช่วยให้คุณระบุข้อมูลในแอปที่อาจต้องอัปเดตได้ เช่น ข้อตกลงสำหรับผู้ใช้ปลายทางหรือคู่มือผู้ใช้ ภายในแอป Android คุณสามารถสร้าง Activity ที่มี WebView แล้วใช้เพื่อแสดงเอกสารที่โฮสต์ออนไลน์ได้
WebView ยังช่วยได้เมื่อแอปของคุณให้ข้อมูลแก่ผู้ใช้ที่ต้องใช้การเชื่อมต่ออินเทอร์เน็ตเพื่อดึงข้อมูล เช่น อีเมล ในกรณีนี้ คุณอาจพบว่าการสร้าง WebView ในแอป Android ที่แสดงหน้าเว็บที่มีข้อมูลผู้ใช้ทั้งหมดนั้นง่ายกว่าการส่งคำขอเครือข่าย จากนั้นแยกวิเคราะห์ข้อมูลและแสดงผลในเลย์เอาต์ Android แต่คุณสามารถออกแบบหน้าเว็บที่ปรับให้เหมาะกับอุปกรณ์ที่ทำงานด้วยระบบ Android แล้วใช้ WebView ในแอป Android ที่โหลดหน้าเว็บนั้นได้
เอกสารนี้อธิบายวิธีเริ่มต้นใช้งาน WebView, วิธีเชื่อมโยง JavaScript จากหน้าเว็บกับโค้ดฝั่งไคลเอ็นต์ในแอป Android, วิธีจัดการการนำทางหน้าเว็บ และวิธีจัดการหน้าต่างเมื่อใช้ WebView
ทำงานกับ WebView ใน Android เวอร์ชันก่อนหน้า
หากต้องการใช้ความสามารถของ WebView ที่ใหม่กว่าอย่างปลอดภัยในอุปกรณ์ที่แอปของคุณทำงานอยู่ ให้เพิ่มไลบรารี Jetpack Webkit นี่คือไลบรารีแบบคงที่ที่คุณสามารถเพิ่มลงในแอปพลิเคชันเพื่อใช้ android.webkit API ที่ไม่พร้อมใช้งานสำหรับแพลตฟอร์มเวอร์ชันก่อนหน้า
เพิ่มโค้ดต่อไปนี้ลงในไฟล์ build.gradle
Kotlin
dependencies { implementation("androidx.webkit:webkit:1.8.0") }
ดึงดูด
dependencies { implementation ("androidx.webkit:webkit:1.8.0") }
ดูรายละเอียดเพิ่มเติมได้ที่ตัวอย่าง WebView ใน GitHub
เพิ่ม WebView ลงในแอป
หากต้องการเพิ่ม WebView ลงในแอป คุณสามารถรวมองค์ประกอบ <WebView> ไว้ในเลย์เอาต์กิจกรรมหรือตั้งค่าหน้าต่าง Activity ทั้งหมดเป็น WebView ใน onCreate
เพิ่ม WebView ในเลย์เอาต์กิจกรรม
หากต้องการเพิ่ม WebView ลงในแอปในเลย์เอาต์ ให้เพิ่มโค้ดต่อไปนี้ลงในไฟล์ XML ของเลย์เอาต์ของกิจกรรม
<WebView android:id="@+id/webview" android:layout_width="match_parent" android:layout_height="match_parent" />
หากต้องการโหลดหน้าเว็บใน WebView ให้ใช้ loadUrl ดังที่แสดงในตัวอย่างต่อไปนี้
Kotlin
val myWebView: WebView = findViewById(R.id.webview) myWebView.loadUrl("http://www.example.com")
Java
WebView myWebView = (WebView) findViewById(R.id.webview); myWebView.loadUrl("http://www.example.com");
เพิ่ม WebView ใน onCreate()
หากต้องการเพิ่ม WebView ลงในแอปในเมธอด onCreate() ของกิจกรรมแทน ให้ใช้ตรรกะที่คล้ายกับต่อไปนี้
Kotlin
val myWebView = WebView(activityContext) setContentView(myWebView)
Java
WebView myWebView = new WebView(activityContext); setContentView(myWebView);
จากนั้นโหลดหน้าเว็บต่อไปนี้
Kotlin
myWebView.loadUrl("http://www.example.com")
Java
myWebView.loadUrl("https://www.example.com");
หรือโหลด URL จากสตริง HTML ดังนี้
Kotlin
// Create an unencoded HTML string, then convert the unencoded HTML string into // bytes. Encode it with base64 and load the data. val unencodedHtml = "<html><body>'%23' is the percent code for ‘#‘ </body></html>"; val encodedHtml = Base64.encodeToString(unencodedHtml.toByteArray(), Base64.NO_PADDING) myWebView.loadData(encodedHtml, "text/html", "base64")
Java
// Create an unencoded HTML string, then convert the unencoded HTML string into // bytes. Encode it with base64 and load the data. String unencodedHtml = "<html><body>'%23' is the percent code for ‘#‘ </body></html>"; String encodedHtml = Base64.encodeToString(unencodedHtml.getBytes(), Base64.NO_PADDING); myWebView.loadData(encodedHtml, "text/html", "base64");
แอปของคุณต้องเข้าถึงอินเทอร์เน็ตได้ หากต้องการเข้าถึงอินเทอร์เน็ต ให้ขอสิทธิ์ INTERNET ในไฟล์ Manifest ดังที่แสดงในตัวอย่างต่อไปนี้
<manifest ... > <uses-permission android:name="android.permission.INTERNET" /> ... </manifest>
คุณปรับแต่ง WebView ได้โดยทำอย่างใดอย่างหนึ่งต่อไปนี้
- การเปิดใช้การรองรับโหมดเต็มหน้าจอโดยใช้
WebChromeClientนอกจากนี้ ระบบจะเรียกใช้คลาสนี้เมื่อWebViewต้องการสิทธิ์ในการแก้ไข UI ของแอปโฮสต์ เช่น การสร้างหรือปิดหน้าต่าง หรือการส่งกล่องโต้ตอบ JavaScript ไปยังผู้ใช้ ดูข้อมูลเพิ่มเติมเกี่ยวกับการแก้ไขข้อบกพร่องในบริบทนี้ได้ที่แก้ไขข้อบกพร่องของเว็บแอป - การจัดการเหตุการณ์ที่ส่งผลต่อการแสดงผลเนื้อหา เช่น ข้อผิดพลาดในการส่งแบบฟอร์มหรือการนําทางโดยใช้
WebViewClientคุณยังใช้คลาสย่อยนี้เพื่อสกัดกั้นการโหลด URL ได้ด้วย - เปิดใช้ JavaScript โดยแก้ไข
WebSettings - การใช้ JavaScript เพื่อเข้าถึงออบเจ็กต์เฟรมเวิร์ก Android ที่คุณแทรกลงใน
WebView
ใช้ JavaScript ใน WebView
หากหน้าเว็บที่คุณต้องการโหลดใน WebView ใช้ JavaScript คุณต้องเปิดใช้ JavaScript สำหรับ WebView หลังจากเปิดใช้ JavaScript แล้ว คุณจะสร้างอินเทอร์เฟซระหว่างโค้ดแอปกับโค้ด JavaScript ได้
เปิดใช้ JavaScript
JavaScript จะปิดใช้อยู่ใน WebView โดยค่าเริ่มต้น คุณเปิดใช้ได้ผ่าน WebSettings ที่เชื่อมโยงกับ WebView ดึงข้อมูล WebSettings ด้วย getSettings แล้วเปิดใช้ JavaScript ด้วย setJavaScriptEnabled
โปรดดูตัวอย่างต่อไปนี้
Kotlin
val myWebView: WebView = findViewById(R.id.webview) myWebView.settings.javaScriptEnabled = true
Java
WebView myWebView = (WebView) findViewById(R.id.webview); WebSettings webSettings = myWebView.getSettings(); webSettings.setJavaScriptEnabled(true);
WebSettings ให้สิทธิ์เข้าถึงการตั้งค่าอื่นๆ ที่หลากหลายซึ่งคุณอาจพบว่ามีประโยชน์ ตัวอย่างเช่น หากคุณกำลังพัฒนาเว็บแอปพลิเคชันที่ออกแบบมาสำหรับ WebView ในแอป Android โดยเฉพาะ คุณสามารถกำหนดสตริง User Agent ที่กำหนดเองด้วย setUserAgentString จากนั้นค้นหา User Agent ที่กำหนดเองในหน้าเว็บเพื่อยืนยันว่าไคลเอ็นต์ที่ขอหน้าเว็บคือแอป Android ของคุณ
เชื่อมโยงโค้ด JavaScript กับโค้ด Android
เมื่อพัฒนาเว็บแอปพลิเคชันที่ออกแบบมาสำหรับ WebView ในแอป Android โดยเฉพาะ คุณสามารถสร้างอินเทอร์เฟซระหว่างโค้ด JavaScript กับโค้ด Android ฝั่งไคลเอ็นต์ได้ ตัวอย่างเช่น โค้ด JavaScript สามารถเรียกใช้เมธอดในโค้ด Android เพื่อแสดง Dialog แทนการใช้ฟังก์ชัน alert() ของ JavaScript
หากต้องการเชื่อมโยงอินเทอร์เฟซใหม่ระหว่างโค้ด JavaScript กับ Android ให้เรียกใช้ addJavascriptInterface โดยส่งอินสแตนซ์คลาสเพื่อเชื่อมโยงกับ JavaScript และชื่ออินเทอร์เฟซที่ JavaScript สามารถเรียกใช้เพื่อเข้าถึงคลาสได้
ดูข้อมูลเพิ่มเติมเกี่ยวกับการสื่อสารระหว่าง JavaScript กับโค้ดแบบเนทีฟ รวมถึง API ที่ทันสมัยและปลอดภัยยิ่งขึ้นได้ที่หัวข้อเข้าถึง API แบบเนทีฟด้วย JSBridge
ตัวอย่างเช่น คุณสามารถรวมคลาสต่อไปนี้ไว้ในแอป Android
Kotlin
/** Instantiate the interface and set the context. */ class WebAppInterface(private val mContext: Context) { /** Show a toast from the web page. */ @JavascriptInterface fun showToast(toast: String) { Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show() } }
Java
public class WebAppInterface { Context mContext; /** Instantiate the interface and set the context. */ WebAppInterface(Context c) { mContext = c; } /** Show a toast from the web page. */ @JavascriptInterface public void showToast(String toast) { Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show(); } }
ในตัวอย่างนี้ คลาส WebAppInterface ช่วยให้หน้าเว็บสร้างข้อความ Toast โดยใช้เมธอด showToast()
คุณสามารถเชื่อมโยงคลาสนี้กับ JavaScript ที่ทำงานใน WebView ด้วย addJavascriptInterface() ดังที่แสดงในตัวอย่างต่อไปนี้
Kotlin
val webView: WebView = findViewById(R.id.webview) webView.addJavascriptInterface(WebAppInterface(this), "Android")
Java
WebView webView = (WebView) findViewById(R.id.webview); webView.addJavascriptInterface(new WebAppInterface(this), "Android");
ซึ่งจะสร้างอินเทอร์เฟซชื่อ Android สำหรับ JavaScript ที่ทำงานใน WebView เมื่อถึงจุดนี้ เว็บแอปพลิเคชันของคุณจะมีสิทธิ์เข้าถึงคลาส WebAppInterface ตัวอย่างเช่น ต่อไปนี้คือ HTML และ JavaScript ที่สร้างข้อความ Toast โดยใช้อินเทอร์เฟซใหม่เมื่อผู้ใช้แตะปุ่ม
<input type="button" value="Say hello" onClick="showAndroidToast('Hello Android!')" /> <script type="text/javascript"> function showAndroidToast(toast) { Android.showToast(toast); } </script>
ไม่จำเป็นต้องเริ่มต้นอินเทอร์เฟซ Android จาก JavaScript WebViewจะทำให้หน้าเว็บของคุณพร้อมใช้งานโดยอัตโนมัติ ดังนั้นเมื่อผู้ใช้แตะปุ่ม ฟังก์ชัน showAndroidToast() จะใช้อินเทอร์เฟซ Android เพื่อเรียกใช้เมธอด WebAppInterface.showToast()
จัดการการนำทางหน้าเว็บ
เมื่อผู้ใช้แตะลิงก์จากหน้าเว็บใน WebView โดยค่าเริ่มต้น Android จะเปิดแอปที่จัดการ URL โดยปกติแล้วเว็บเบราว์เซอร์เริ่มต้นจะเปิดและโหลด URL ปลายทาง อย่างไรก็ตาม คุณสามารถลบล้างลักษณะการทำงานนี้สำหรับ WebView เพื่อให้ลิงก์เปิดภายใน WebView ได้ จากนั้นคุณสามารถอนุญาตให้ผู้ใช้ไปยังส่วนต่างๆ ย้อนกลับและไปข้างหน้าผ่านประวัติหน้าเว็บที่ WebView ของคุณเก็บรักษาไว้
หากต้องการเปิดลิงก์ที่ผู้ใช้แตะ ให้ระบุ WebViewClient สำหรับ WebView โดยใช้ setWebViewClient ลิงก์ทั้งหมดที่ผู้ใช้แตะจะโหลดใน WebView ของคุณ หากต้องการควบคุมตำแหน่งที่ลิงก์ที่คลิกจะโหลดได้มากขึ้น ให้สร้าง WebViewClient ของคุณเองที่ลบล้างเมธอด shouldOverrideUrlLoading ตัวอย่างต่อไปนี้ถือว่า MyWebViewClient เป็นคลาสภายในของ Activity
Kotlin
private class MyWebViewClient : WebViewClient() { override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean { if (Uri.parse(url).host == "www.example.com") { // This is your website, so don't override. Let your WebView load // the page. return false } // Otherwise, the link isn't for a page on your site, so launch another // Activity that handles URLs. Intent(Intent.ACTION_VIEW, Uri.parse(url)).apply { startActivity(this) } return true } }
Java
private class MyWebViewClient extends WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { if ("www.example.com".equals(request.getUrl().getHost())) { // This is your website, so don't override. Let your WebView load the // page. return false; } // Otherwise, the link isn't for a page on your site, so launch another // Activity that handles URLs. Intent intent = new Intent(Intent.ACTION_VIEW, request.getUrl()); startActivity(intent); return true; } }
จากนั้นสร้างอินสแตนซ์ของ WebViewClient ใหม่นี้สำหรับ WebView ดังนี้
Kotlin
val myWebView: WebView = findViewById(R.id.webview) myWebView.webViewClient = MyWebViewClient()
Java
WebView myWebView = (WebView) findViewById(R.id.webview); myWebView.setWebViewClient(new MyWebViewClient());
ตอนนี้เมื่อผู้ใช้แตะลิงก์ ระบบจะเรียกใช้เมธอด shouldOverrideUrlLoading ซึ่งจะตรวจสอบว่าโฮสต์ URL ตรงกับโดเมนที่เฉพาะเจาะจงหรือไม่ ตามที่กำหนดไว้ในตัวอย่างก่อนหน้านี้ หากตรงกัน เมธอดจะแสดงผลเป็น "เท็จ" และไม่ลบล้างการโหลด URL ซึ่งจะช่วยให้ WebView โหลด URL ได้ตามปกติ
หากโฮสต์ URL ไม่ตรงกัน ระบบจะสร้าง Intent เพื่อเปิด Activity เริ่มต้นสำหรับการจัดการ URL ซึ่งจะเปลี่ยนเส้นทางไปยังเว็บเบราว์เซอร์เริ่มต้นของผู้ใช้
URL ที่กำหนดเองของแฮนเดิล
WebView ใช้ข้อจำกัดเมื่อขอทรัพยากรและแก้ไขลิงก์ที่ใช้ URL Scheme ที่กำหนดเอง ตัวอย่างเช่น หากคุณใช้ Callback เช่น shouldOverrideUrlLoading หรือ shouldInterceptRequest WebView จะเรียกใช้ Callback เหล่านั้นสำหรับ URL ที่ถูกต้องเท่านั้น
ตัวอย่างเช่น WebView อาจไม่เรียกใช้เมธอด shouldOverrideUrlLoading สำหรับลิงก์ต่อไปนี้
<a href="showProfile">Show Profile</a>
URL ที่ไม่ถูกต้อง เช่น URL ที่แสดงในตัวอย่างก่อนหน้านี้ จะได้รับการจัดการอย่างไม่สอดคล้องกันใน WebView เราจึงขอแนะนำให้ใช้ URL ที่มีรูปแบบถูกต้องแทน
คุณสามารถใช้รูปแบบที่กำหนดเองหรือ HTTPS URL สำหรับโดเมนที่องค์กรของคุณควบคุม
คุณสามารถใช้รูปแบบที่กำหนดเองได้ เช่น รูปแบบต่อไปนี้ แทนที่จะใช้สตริงธรรมดาในลิงก์เหมือนในตัวอย่างก่อนหน้า
<a href="example-app:showProfile">Show Profile</a>
จากนั้นคุณสามารถจัดการ URL นี้ในเมธอด shouldOverrideUrlLoading ได้ดังนี้
Kotlin
// The URL scheme must be non-hierarchical, meaning no trailing slashes. const val APP_SCHEME = "example-app:" override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean { return if (url?.startsWith(APP_SCHEME) == true) { urlData = URLDecoder.decode(url.substring(APP_SCHEME.length), "UTF-8") respondToData(urlData) true } else { false } }
Java
// The URL scheme must be non-hierarchical, meaning no trailing slashes. private static final String APP_SCHEME = "example-app:"; @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { if (url.startsWith(APP_SCHEME)) { urlData = URLDecoder.decode(url.substring(APP_SCHEME.length()), "UTF-8"); respondToData(urlData); return true; } return false; }
API shouldOverrideUrlLoading มีไว้เพื่อเปิด Intent สำหรับ URL ที่เฉพาะเจาะจงเป็นหลัก เมื่อนำไปใช้ โปรดตรวจสอบว่าได้แสดงผล false สำหรับ URL ที่ WebView จัดการ แต่คุณไม่ได้จำกัดอยู่แค่การเปิด Intent เท่านั้น คุณสามารถแทนที่ Intent การเปิดใช้งานด้วยลักษณะการทำงานที่กำหนดเองในตัวอย่างโค้ดก่อนหน้า
ไปยังส่วนต่างๆ ในประวัติหน้าเว็บ
เมื่อ WebView ลบล้างการโหลด URL ระบบจะรวบรวมประวัติหน้าเว็บที่เข้าชมโดยอัตโนมัติ คุณสามารถย้อนกลับและไปข้างหน้าในประวัติได้ด้วย goBack และ goForward
ตัวอย่างเช่น ตัวอย่างต่อไปนี้แสดงวิธีที่ Activity สามารถใช้ปุ่มย้อนกลับของอุปกรณ์เพื่อไปยังส่วนต่างๆ แบบย้อนกลับ
Kotlin
override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { // Check whether the key event is the Back button and if there's history. if (keyCode == KeyEvent.KEYCODE_BACK && myWebView.canGoBack()) { myWebView.goBack() return true } // If it isn't the Back button or there isn't web page history, bubble up to // the default system behavior. Probably exit the activity. return super.onKeyDown(keyCode, event) }
Java
@Override public boolean onKeyDown(int keyCode, KeyEvent event) { // Check whether the key event is the Back button and if there's history. if ((keyCode == KeyEvent.KEYCODE_BACK) && myWebView.canGoBack()) { myWebView.goBack(); return true; } // If it isn't the Back button or there's no web page history, bubble up to // the default system behavior. Probably exit the activity. return super.onKeyDown(keyCode, event); }
หากแอปใช้ Jetpack AppCompat 1.6.0 ขึ้นไป คุณสามารถลดความซับซ้อนของข้อมูลโค้ดก่อนหน้าได้มากขึ้น ดังนี้
Kotlin
onBackPressedDispatcher.addCallback { // Check whether there's history. if (myWebView.canGoBack()) { myWebView.goBack() } }
Java
onBackPressedDispatcher.addCallback { // Check whether there's history. if (myWebView.canGoBack()) { myWebView.goBack(); } }
เมธอด canGoBack จะแสดงผลเป็น "จริง" หากมีประวัติหน้าเว็บให้ผู้ใช้เข้าชม ในทำนองเดียวกัน คุณสามารถใช้ canGoForward เพื่อตรวจสอบว่ามีประวัติการส่งต่อหรือไม่ หากไม่ดำเนินการตรวจสอบนี้ หลังจากที่ผู้ใช้ไปถึงจุดสิ้นสุดของประวัติแล้ว goBack และ goForward จะไม่ดำเนินการใดๆ
หากต้องการเก็บประวัติการนําทางไว้ตลอดการสร้างกิจกรรมใหม่หรือการเรียกคืนกระบวนการเบื้องหลัง ให้ใช้ saveState เพื่อจัดเรียงประวัติการนําทางของ WebView เป็น Bundle และใช้ restoreState เพื่อกู้คืน
ดูคำแนะนำเกี่ยวกับการจัดการขีดจำกัดขนาดสถานะที่บันทึกไว้อย่างปลอดภัยและการหลีกเลี่ยง TransactionTooLargeException ได้ที่หัวข้อจัดการสถานะ WebView อย่างมีประสิทธิภาพ
จัดการการเปลี่ยนแปลงการกำหนดค่าอุปกรณ์
ในระหว่างรันไทม์ การเปลี่ยนแปลงสถานะกิจกรรมจะเกิดขึ้นเมื่อการกำหนดค่าของอุปกรณ์เปลี่ยนแปลง เช่น เมื่อผู้ใช้หมุนอุปกรณ์หรือปิดตัวแก้ไขวิธีการป้อนข้อมูล (IME) การเปลี่ยนแปลงเหล่านี้ทำให้กิจกรรมของออบเจ็กต์ WebView ถูกทำลายและมีการสร้างกิจกรรมใหม่ ซึ่งจะสร้างออบเจ็กต์ WebView ใหม่ที่โหลด URL ของออบเจ็กต์ที่ถูกทำลายด้วย คุณสามารถใช้ saveState ภายใน onSaveInstanceState() และ restoreState เมื่อสร้างใหม่เพื่อกู้คืนบริบทการนำทางของผู้ใช้ ดูกลยุทธ์ในการจัดการขนาดสถานะอย่างปลอดภัยได้ที่หัวข้อจัดการสถานะ WebView อย่างมีประสิทธิภาพ
หากต้องการแก้ไขลักษณะการทำงานเริ่มต้นของกิจกรรม คุณสามารถเปลี่ยนวิธีจัดการการเปลี่ยนแปลง orientation ในไฟล์ Manifest ได้ ดูข้อมูลเพิ่มเติมเกี่ยวกับการจัดการการเปลี่ยนแปลงการกำหนดค่าระหว่างรันไทม์ได้ที่หัวข้อจัดการการเปลี่ยนแปลงการกำหนดค่า
จัดการหน้าต่าง
โดยค่าเริ่มต้น ระบบจะไม่สนใจคำขอเปิดหน้าต่างใหม่ ซึ่งจะเป็นเช่นนี้ไม่ว่าจะเปิดโดย JavaScript หรือโดยแอตทริบิวต์เป้าหมายในลิงก์ คุณสามารถปรับแต่ง WebChromeClient เพื่อกำหนดลักษณะการทำงานของคุณเองสำหรับการเปิดหน้าต่างหลายหน้าต่าง
เพื่อรักษาแอปให้ปลอดภัยยิ่งขึ้น คุณควรป้องกันไม่ให้ป๊อปอัปและหน้าต่างใหม่เปิดขึ้น วิธีที่ปลอดภัยที่สุดในการใช้ลักษณะการทำงานนี้คือการส่ง "true" ไปยัง setSupportMultipleWindows แต่ไม่ลบล้างเมธอด onCreateWindow ซึ่ง setSupportMultipleWindows() ต้องใช้
ตรรกะนี้จะป้องกันไม่ให้หน้าเว็บที่ใช้ target="_blank" ในลิงก์โหลดขึ้นมา
จัดการหน่วยความจำและประสิทธิภาพ
เนื่องจาก WebView ทำงานบนเครื่องมือที่ใช้ Chromium ซึ่งมีกระบวนการและโค้ดแบบเนทีฟแยกต่างหาก การใช้งานหน่วยความจำพื้นฐานจึงสูงกว่ามุมมอง Android มาตรฐาน
การนำอินสแตนซ์ WebView กลับมาใช้ใหม่และการทำลายอินสแตนซ์อย่างเหมาะสมเป็นสิ่งสำคัญในการรักษาแอปให้เสถียร
ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีวิเคราะห์และเพิ่มประสิทธิภาพหน่วยความจำที่ใช้ของแอปเมื่อใช้เนื้อหาเว็บได้ที่จัดการและวิเคราะห์หน่วยความจำ WebView