Google berkomitmen untuk mendorong terwujudnya keadilan ras bagi komunitas Kulit Hitam. Lihat caranya.

Membuat aplikasi web di WebView

Jika ingin menyediakan aplikasi web (atau hanya halaman web) sebagai bagian dari aplikasi klien, Anda dapat melakukannya menggunakan WebView. Class WebView adalah ekstensi class View Android yang memungkinkan Anda menampilkan halaman web sebagai bagian dari tata letak aktivitas Anda. Class ini tidak menyertakan fitur apa pun dari browser web yang dikembangkan sepenuhnya, seperti kontrol navigasi atau kolom URL. Semua yang dilakukan WebView secara default adalah menampilkan halaman web.

Skenario umum ketika menggunakan WebView menjadi sangat membantu adalah saat Anda ingin memberikan informasi di aplikasi yang mungkin perlu diperbarui, seperti perjanjian pengguna akhir atau panduan pengguna. Dalam aplikasi Android, Anda dapat membuat Activity yang berisi WebView, lalu menggunakannya untuk menampilkan dokumen Anda yang dihosting secara online.

Skenario lain ketika WebView menjadi sangat membantu adalah saat aplikasi Anda memberikan data kepada pengguna yang selalu memerlukan koneksi internet untuk mengambil data, seperti email. Dalam kasus ini, Anda mungkin menyadari bahwa lebih mudah untuk membuat WebView di aplikasi Android Anda yang menampilkan halaman web dengan semua data pengguna, daripada membuat permintaan jaringan, lalu mengurai data, dan merendernya dalam tata letak Android. Sebagai gantinya, Anda dapat merancang halaman web yang disesuaikan untuk perangkat Android, lalu menerapkan WebView di aplikasi Android Anda yang memuat halaman web.

Dokumen ini menunjukkan cara memulai WebView dan cara melakukan beberapa hal tambahan, seperti menangani navigasi halaman dan mengikat JavaScript dari halaman web Anda ke kode sisi klien di aplikasi Android Anda.

Menambahkan WebView ke aplikasi Anda

Untuk menambahkan WebView di aplikasi, Anda dapat menyertakan elemen <WebView> di tata letak aktivitas, atau menetapkan seluruh jendela Aktivitas sebagai WebView di onCreate().

Menambahkan WebView di tata letak aktivitas

Untuk menambahkan WebView ke aplikasi Anda di tata letak, tambahkan kode berikut ke file XML tata letak aktivitas Anda:

    <WebView
        android:id="@+id/webview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
    />
    

Untuk memuat halaman web di WebView, gunakan loadUrl(). Contoh:

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");
    

Menambahkan WebView di onCreate()

Untuk menambahkan WebView ke aplikasi Anda di metode onCreate() aktivitas, gunakan logika yang mirip dengan yang berikut ini:

Kotlin

    val myWebView = WebView(activityContext)
    setContentView(myWebView)
    

Java

    WebView myWebView = new WebView(activityContext);
    setContentView(myWebView);
    

Kemudian muat halaman dengan:

Kotlin

    myWebView.loadUrl("http://www.example.com")
    

Java

    myWebView.loadUrl("https://www.example.com");
    

Atau muat URL dari string 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 =
            "&lt;html&gt;&lt;body&gt;'%23' is the percent code for ‘#‘ &lt;/body&gt;&lt;/html&gt;"
    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 =
         "&lt;html&gt;&lt;body&gt;'%23' is the percent code for ‘#‘ &lt;/body&gt;&lt;/html&gt;";
    String encodedHtml = Base64.encodeToString(unencodedHtml.getBytes(),
            Base64.NO_PADDING);
    myWebView.loadData(encodedHtml, "text/html", "base64");
    

Catatan: Ada beberapa batasan pada hal yang dapat dilakukan HTML ini. Lihat loadData() dan loadDataWithBaseURL() untuk informasi selengkapnya tentang opsi encoding.

Namun, sebelum berfungsi, aplikasi Anda harus memiliki akses ke Internet. Untuk mendapatkan akses Internet, minta izin INTERNET di file manifes Anda. Contoh:

    <manifest ... >
        <uses-permission android:name="android.permission.INTERNET" />
        ...
    </manifest>
    

Itulah semua yang Anda butuhkan untuk dasar WebView yang menampilkan halaman web. Selain itu, Anda dapat menyesuaikan WebView dengan mengubah hal-hal berikut:

  • Mengaktifkan dukungan layar penuh dengan WebChromeClient. Class ini juga dipanggil saat WebView memerlukan izin untuk mengubah UI aplikasi host, seperti membuat atau menutup jendela dan mengirim dialog JavaScript kepada pengguna. Untuk mempelajari lebih lanjut proses debug dalam konteks ini, baca Proses Debug Aplikasi Web.
  • Menangani peristiwa yang memengaruhi perenderan konten, seperti error pada pengiriman formulir atau navigasi dengan WebViewClient. Anda juga dapat menggunakan subclass ini untuk mengintersep pemuatan URL.
  • Mengaktifkan JavaScript dengan mengubah WebSettings.
  • Menggunakan JavaScript untuk mengakses objek framework Android yang telah Anda masukkan ke dalam WebView.

Menggunakan JavaScript di WebView

Jika halaman web yang ingin dimuat di WebView menggunakan JavaScript, Anda harus mengaktifkan JavaScript untuk Anda. Setelah JavaScript diaktifkan, Anda juga dapat membuat antarmuka di antara kode aplikasi dan kode JavaScript.

Mengaktifkan JavaScript

JavaScript dinonaktifkan di WebView secara default. Anda dapat mengaktifkannya melalui WebSettings yang dilampirkan pada WebView. Anda dapat mengambil WebSettings dengan getSettings(), lalu mengaktifkan JavaScript dengan setJavaScriptEnabled().

Contoh:

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 memberikan akses ke berbagai setelan lain yang mungkin berguna bagi Anda. Misalnya, jika mengembangkan aplikasi web yang dirancang khusus untuk WebView di aplikasi Android, Anda dapat menentukan string agen pengguna kustom dengan setUserAgentString(), lalu mengkueri agen pengguna kustom di halaman web Anda untuk memverifikasi bahwa klien yang meminta halaman web Anda sebenarnya adalah aplikasi Android Anda.

Mengikat kode JavaScript ke kode Android

Saat mengembangkan aplikasi web yang dirancang khusus untuk WebView di aplikasi Android, Anda dapat membuat antarmuka di antara kode JavaScript dan kode Android sisi klien. Misalnya, kode JavaScript dapat memanggil metode di kode Android untuk menampilkan Dialog, alih-alih menggunakan fungsi alert() JavaScript.

Untuk mengikat antarmuka baru di antara kode JavaScript dan Android, panggil addJavascriptInterface(), dengan meneruskannya instance class untuk mengikat JavaScript dan nama antarmuka yang dapat dipanggil oleh JavaScript untuk mengakses class tersebut.

Misalnya, Anda dapat menyertakan class berikut di aplikasi 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();
        }
    }
    

Perhatian: Jika telah menetapkan targetSdkVersion ke 17 atau yang lebih tinggi, Anda harus menambahkan anotasi @JavascriptInterface ke metode apa pun yang ingin disediakan untuk JavaScript Anda (metode tersebut juga harus bersifat publik). Jika Anda tidak memberikan anotasi tersebut, metode ini tidak dapat diakses oleh halaman web Anda saat berjalan di Android 4.2 atau yang lebih tinggi.

Dalam contoh ini, class WebAppInterface memungkinkan halaman web untuk membuat pesan Toast, menggunakan metode showToast().

Anda dapat mengikat class ini ke JavaScript yang berjalan di WebView dengan addJavascriptInterface() dan menamai antarmuka Android. Contoh:

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");
    

Tindakan ini akan membuat antarmuka yang disebut Android untuk JavaScript berjalan di WebView. Pada tahap ini, aplikasi web Anda memiliki akses ke class WebAppInterface. Misalnya, berikut beberapa HTML dan JavaScript yang membuat pesan toast menggunakan antarmuka baru saat pengguna mengklik tombol:

    <input type="button" value="Say hello" onClick="showAndroidToast('Hello Android!')" />

    <script type="text/javascript">
        function showAndroidToast(toast) {
            Android.showToast(toast);
        }
    </script>
    

Anda tidak perlu melakukan inisialisasi antarmuka Android dari JavaScript. WebView otomatis membuatnya tersedia untuk halaman web Anda. Jadi, saat klik tombol, fungsi showAndroidToast() akan menggunakan antarmuka Android untuk memanggil metode WebAppInterface.showToast().

Catatan: Objek yang terikat ke JavaScript Anda berjalan di thread lain dan bukan di thread tempat objek tersebut dibuat.

Perhatian: Menggunakan addJavascriptInterface() memungkinkan JavaScript mengontrol aplikasi Android Anda. Tindakan ini dapat menjadi fitur yang sangat berguna atau masalah keamanan yang berbahaya. Saat HTML di WebView tidak dapat dipercaya (misalnya, sebagian atau seluruh HTML disediakan oleh orang atau proses yang tidak dikenal), maka penyerang dapat menyertakan HTML yang menjalankan kode sisi klien Anda dan kemungkinan semua kode yang dipilih penyerang tersebut. Dengan demikian, Anda tidak boleh menggunakan addJavascriptInterface() kecuali untuk menulis semua HTML dan JavaScript yang muncul di WebView. Anda seharusnya juga tidak mengizinkan pengguna untuk membuka halaman web lain yang bukan milik Anda, dalam WebView (sebagai gantinya, izinkan aplikasi browser default pengguna untuk membuka link asing—secara default, browser web pengguna akan membuka semua link URL, jadi berhati-hatilah jika Anda menangani navigasi halaman seperti yang dijelaskan di bagian berikut).

Menangani navigasi halaman

Saat pengguna mengklik link dari halaman web di WebView, perilaku defaultnya adalah Android meluncurkan aplikasi yang menangani URL. Biasanya, browser web default akan membuka dan memuat URL tujuan. Namun, Anda dapat mengganti perilaku ini untuk WebView, sehingga link akan terbuka dalam WebView. Anda kemudian dapat mengizinkan pengguna untuk menavigasi mundur dan maju pada histori halaman web mereka yang dikelola oleh WebView Anda.

Catatan: Demi alasan keamanan, aplikasi browser sistem tidak akan membagikan data aplikasinya dengan aplikasi Anda.

Untuk membuka link yang diklik oleh pengguna, berikan WebViewClient untuk WebView Anda, menggunakan setWebViewClient(). Contoh:

Kotlin

    val myWebView: WebView = findViewById(R.id.webview)
    myWebView.webViewClient = WebViewClient()
    

Java

    WebView myWebView = (WebView) findViewById(R.id.webview);
    myWebView.setWebViewClient(MyWebViewClient);
    

Selesai. Sekarang semua link yang diklik pengguna akan dimuat di WebView Anda.

Jika Anda menginginkan kontrol lebih untuk tempat link yang diklik dimuat, buat WebViewClient Anda sendiri yang menggantikan metode shouldOverrideUrlLoading(). Contoh:

Kotlin

    private class MyWebViewClient : WebViewClient() {

        override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean {
            if (Uri.parse(url).host == "www.example.com") {
                // This is my web site, so do not override; let my WebView load the page
                return false
            }
            // Otherwise, the link is not for a page on my 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, String url) {
            if ("www.example.com".equals(Uri.parse(url).getHost())) {
                // This is my website, so do not override; let my WebView load the page
                return false;
            }
            // Otherwise, the link is not for a page on my site, so launch another Activity that handles URLs
            Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
            startActivity(intent);
            return true;
        }
    }
    

Kemudian, buat instance WebViewClient baru ini untuk WebView:

Kotlin

    val myWebView: WebView = findViewById(R.id.webview)
    myWebView.webViewClient = MyWebViewClient()
    

Java

    WebView myWebView = (WebView) findViewById(R.id.webview);
    myWebView.setWebViewClient(new MyWebViewClient());
    

Sekarang, saat pengguna mengklik link, sistem akan memanggil shouldOverrideUrlLoading(), yang memeriksa apakah host URL cocok dengan domain tertentu atau tidak (seperti yang dijelaskan di atas). Jika cocok, maka metode akan menampilkan false agar tidak mengganti pemuatan URL (memungkinkan WebView untuk memuat URL seperti biasa). Jika host URL tidak cocok, maka Intent akan dibuat guna meluncurkan Aktivitas default untuk menangani URL (yang dicocokkan untuk browser web default pengguna).

Saat mengganti pemuatan URL, WebView Anda otomatis mengakumulasi histori halaman web yang dikunjungi. Anda dapat menavigasi mundur dan maju di histori dengan goBack() dan goForward().

Misalnya, berikut adalah cara Activity Anda dapat menggunakan tombol Kembali perangkat untuk menavigasi mundur:

Kotlin

    override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
        // Check if the key event was the Back button and if there's history
        if (keyCode == KeyEvent.KEYCODE_BACK && myWebView.canGoBack()) {
            myWebView.goBack()
            return true
        }
        // If it wasn't the Back key or there's no 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 if the key event was the Back button and if there's history
        if ((keyCode == KeyEvent.KEYCODE_BACK) && myWebView.canGoBack()) {
            myWebView.goBack();
            return true;
        }
        // If it wasn't the Back key or there's no web page history, bubble up to the default
        // system behavior (probably exit the activity)
        return super.onKeyDown(keyCode, event);
    }
    }

canGoBack() akan menampilkan true jika benar-benar ada histori halaman web untuk dikunjungi pengguna. Demikian juga, Anda dapat menggunakan canGoForward() untuk memeriksa apakah ada histori penerusan. Jika Anda tidak melakukan pemeriksaan ini setelah pengguna mencapai akhir histori, maka goBack() atau goForward() tidak akan melakukan apa-apa.

Menangani perubahan konfigurasi perangkat

Selama waktu proses, perubahan status aktivitas terjadi saat konfigurasi perangkat berubah, misalnya saat pengguna memutar perangkat atau menutup editor metode masukan (IME). Perubahan ini akan menyebabkan objek WebView aktivitas diakhiri dan aktivitas baru dibuat, yang juga membuat objek WebView baru yang akan memuat URL objek yang dihancurkan. Untuk mengubah perilaku default aktivitas, Anda dapat mengubah caranya menangani perubahan orientation di manifes Anda. Untuk mempelajari lebih lanjut penanganan perubahan konfigurasi selama waktu proses, baca Menangani perubahan konfigurasi.

Mengelola jendela

Secara default, permintaan untuk membuka jendela baru akan diabaikan. Hal ini berlaku jika jendela tersebut dibuka oleh JavaScript atau atribut target di suatu link. Anda dapat menyesuaikan WebChromeClient untuk memberikan perilaku Anda sendiri saat membuka beberapa jendela.

Perhatian: Agar aplikasi Anda lebih aman, sebaiknya cegah pop-up dan jendela baru agar tidak terbuka. Cara paling aman untuk mengimplementasikan perilaku ini adalah dengan meneruskan "true" ke dalam setSupportMultipleWindows() tetapi tidak mengganti metode onCreateWindow(), yang merupakan metode tempat setSupportMultipleWindows() bergantung. Namun, perhatikan bahwa logika ini juga mencegah semua halaman yang menggunakan target="_blank" di linknya untuk dimuat.