• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1page.title=Building Web Apps in WebView
2@jd:body
3
4<div id="qv-wrapper">
5<div id="qv">
6<h2>Quickview</h2>
7<ul>
8  <li>Use {@link android.webkit.WebView} to display web pages in your Android application
9layout</li>
10  <li>You can create interfaces from your JavaScript to your client-side Android code</li>
11</ul>
12
13<h2>In this document</h2>
14<ol>
15  <li><a href="#AddingWebView">Adding a WebView to Your Application</a></li>
16  <li><a href="#UsingJavaScript">Using JavaScript in WebView</a>
17    <ol>
18      <li><a href="#EnablingJavaScript">Enabling JavaScript</a></li>
19      <li><a href="#BindingJavaScript">Binding JavaScript code to Android code</a></li>
20    </ol>
21  </li>
22  <li><a href="#HandlingNavigation">Handling Page Navigation</a>
23    <ol>
24      <li><a href="#NavigatingHistory">Navigating web page history</a></li>
25    </ol>
26  </li>
27</ol>
28
29<h2>Key classes</h2>
30<ol>
31  <li>{@link android.webkit.WebView}</li>
32  <li>{@link android.webkit.WebSettings}</li>
33  <li>{@link android.webkit.WebViewClient}</li>
34</ol>
35
36<h2>Related tutorials</h2>
37<ol>
38  <li><a href="{@docRoot}resources/tutorials/views/hello-webview.html">Web View</a></li>
39</ol>
40
41</div>
42</div>
43
44<p>If you want to deliver a web application (or just a web page) as a part of a client application,
45you can do it using {@link android.webkit.WebView}. The {@link android.webkit.WebView} class is an
46extension of Android's {@link android.view.View} class that allows you to display web pages as a
47part of your activity layout. It does <em>not</em> include any features of a fully developed web
48browser, such as navigation controls or an address bar. All that {@link android.webkit.WebView}
49does, by default, is show a web page.</p>
50
51<p>A common scenario in which using {@link android.webkit.WebView} is helpful is when you want to
52provide information in your application that you might need to update, such as an end-user agreement
53or a user guide. Within your Android application, you can create an {@link android.app.Activity}
54that contains a {@link android.webkit.WebView}, then use that to display your document that's
55hosted online.</p>
56
57<p>Another scenario in which {@link android.webkit.WebView} can help is if your application provides
58data to the user that
59always requires an Internet connection to retrieve data, such as email. In this case, you might
60find that it's easier to build a {@link android.webkit.WebView} in your Android application that
61shows a web page with all
62the user data, rather than performing a network request, then parsing the data and rendering it in
63an Android layout. Instead, you can design a web page that's tailored for Android devices
64and then implement a {@link android.webkit.WebView} in your Android application that loads the web
65page.</p>
66
67<p>This document shows you how to get started with {@link android.webkit.WebView} and how to do some
68additional things, such as handle page navigation and bind JavaScript from your web page to
69client-side code in your Android application.</p>
70
71
72
73<h2 id="AddingWebView">Adding a WebView to Your Application</h2>
74
75<p>To add a {@link android.webkit.WebView} to your Application, simply include the {@code
76&lt;WebView&gt;} element in your activity layout. For example, here's a layout file in which the
77{@link android.webkit.WebView} fills the screen:</p>
78
79<pre>
80&lt;?xml version="1.0" encoding="utf-8"?&gt;
81&lt;WebView  xmlns:android="http://schemas.android.com/apk/res/android"
82    android:id="@+id/webview"
83    android:layout_width="fill_parent"
84    android:layout_height="fill_parent"
85/&gt;
86</pre>
87
88<p>To load a web page in the {@link android.webkit.WebView}, use {@link
89android.webkit.WebView#loadUrl(String) loadUrl()}. For example:</p>
90
91<pre>
92WebView myWebView = (WebView) findViewById(R.id.webview);
93myWebView.loadUrl("http://www.example.com");
94</pre>
95
96<p>Before this will work, however, your application must have access to the Internet. To get
97Internet access, request the {@link android.Manifest.permission#INTERNET} permission in your
98manifest file. For example:</p>
99
100<pre>
101&lt;manifest ... &gt;
102    &lt;uses-permission android:name="android.permission.INTERNET" /&gt;
103    ...
104&lt;/manifest&gt;
105</pre>
106
107<p>That's all you need for a basic {@link android.webkit.WebView} that displays a web page.</p>
108
109
110
111
112<h2 id="UsingJavaScript">Using JavaScript in WebView</h2>
113
114<p>If the web page you plan to load in your {@link android.webkit.WebView} use JavaScript, you
115must enable JavaScript for your {@link android.webkit.WebView}. Once JavaScript is enabled, you can
116also create interfaces between your application code and your JavaScript code.</p>
117
118
119<h3 id="EnablingJavaScript">Enabling JavaScript</h3>
120
121<p>JavaScript is disabled in a {@link android.webkit.WebView} by default. You can enable it
122through the {@link
123android.webkit.WebSettings} attached to your {@link android.webkit.WebView}. You can retrieve {@link
124android.webkit.WebSettings} with {@link android.webkit.WebView#getSettings()}, then enable
125JavaScript with {@link android.webkit.WebSettings#setJavaScriptEnabled(boolean)
126setJavaScriptEnabled()}.</p>
127
128<p>For example:</p>
129
130<pre>
131WebView myWebView = (WebView) findViewById(R.id.webview);
132WebSettings webSettings = myWebView.getSettings();
133webSettings.setJavaScriptEnabled(true);
134</pre>
135
136<p>{@link android.webkit.WebSettings} provides access to a variety of other settings that you might
137find useful. For example, if you're developing a web application
138that's designed specifically for the {@link android.webkit.WebView} in your Android application,
139then you can define a
140custom user agent string with {@link android.webkit.WebSettings#setUserAgentString(String)
141setUserAgentString()}, then query the custom user agent in your web page to verify that the
142client requesting your web page is actually your Android application.</p>
143
144from your Android SDK {@code tools/} directory
145<h3 id="BindingJavaScript">Binding JavaScript code to Android code</h3>
146
147<p>When developing a web application that's designed specifically for the {@link
148android.webkit.WebView} in your Android
149application, you can create interfaces between your JavaScript code and client-side Android code.
150For example, your JavaScript code can call a method in your Android code to display a {@link
151android.app.Dialog}, instead of using JavaScript's {@code alert()} function.</p>
152
153<p>To bind a new interface between your JavaScript and Android code, call {@link
154android.webkit.WebView#addJavascriptInterface(Object,String) addJavascriptInterface()}, passing it
155a class instance to bind to your JavaScript and an interface name that your JavaScript can call to
156access the class.</p>
157
158<p>For example, you can include the following class in your Android application:</p>
159
160<pre>
161public class WebAppInterface {
162    Context mContext;
163
164    /** Instantiate the interface and set the context */
165    WebAppInterface(Context c) {
166        mContext = c;
167    }
168
169    /** Show a toast from the web page */
170    &#64;JavascriptInterface
171    public void showToast(String toast) {
172        Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show();
173    }
174}
175</pre>
176
177<p class="caution"><strong>Caution:</strong> If you've set your <a
178href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#target">{@code targetSdkVersion}</a>
179to 17 or higher, <strong>you
180must add the {@code &#64;JavascriptInterface} annotation</strong> to any method that you want
181available your web page code (the method must also be public). If you do not provide the
182annotation, then the method will not accessible by your web page when running on Android 4.2 or
183higher.</p>
184
185<p>In this example, the {@code WebAppInterface} class allows the web page to create a {@link
186android.widget.Toast} message, using the {@code showToast()} method.</p>
187
188<p>You can bind this class to the JavaScript that runs in your {@link android.webkit.WebView} with
189{@link android.webkit.WebView#addJavascriptInterface(Object,String) addJavascriptInterface()} and
190name the interface {@code Android}. For example:</p>
191
192<pre>
193WebView webView = (WebView) findViewById(R.id.webview);
194webView.addJavascriptInterface(new WebAppInterface(this), "Android");
195</pre>
196
197<p>This creates an interface called {@code Android} for JavaScript running in the {@link
198android.webkit.WebView}. At this point, your web application has access to the {@code
199WebAppInterface} class. For example, here's some HTML and JavaScript that creates a toast
200message using the new interface when the user clicks a button:</p>
201
202<pre>
203&lt;input type="button" value="Say hello" onClick="showAndroidToast('Hello Android!')" /&gt;
204
205&lt;script type="text/javascript"&gt;
206    function showAndroidToast(toast) {
207        Android.showToast(toast);
208    }
209&lt;/script&gt;
210</pre>
211
212<p>There's no need to initialize the {@code Android} interface from JavaScript. The {@link
213android.webkit.WebView} automatically makes it
214available to your web page. So, at the click of the button, the {@code showAndroidToast()}
215function uses the {@code Android} interface to call the {@code WebAppInterface.showToast()}
216method.</p>
217
218<p class="note"><strong>Note:</strong> The object that is bound to your JavaScript runs in
219another thread and not in the thread in which it was constructed.</p>
220
221<p class="caution"><strong>Caution:</strong> Using {@link
222android.webkit.WebView#addJavascriptInterface(Object,String) addJavascriptInterface()} allows
223JavaScript to control your Android application. This can be a very useful feature or a dangerous
224security issue. When the HTML in the {@link android.webkit.WebView} is untrustworthy (for example,
225part or all of the HTML
226is provided by an unknown person or process), then an attacker can include HTML that executes
227your client-side code and possibly any code of the attacker's choosing. As such, you should not use
228{@link android.webkit.WebView#addJavascriptInterface(Object,String) addJavascriptInterface()} unless
229you wrote all of the HTML and JavaScript that appears in your {@link android.webkit.WebView}. You
230should also not allow the user to
231navigate to other web pages that are not your own, within your {@link android.webkit.WebView}
232(instead, allow the user's
233default browser application to open foreign links&mdash;by default, the user's web browser
234opens all URL links, so be careful only if you handle page navigation as described in the
235following section).</p>
236
237
238
239
240<h2 id="HandlingNavigation">Handling Page Navigation</h2>
241
242<p>When the user clicks a link from a web page in your {@link android.webkit.WebView}, the default
243behavior is
244for Android to launch an application that handles URLs. Usually, the default web browser opens and
245loads the destination URL. However, you can override this behavior for your {@link
246android.webkit.WebView},
247so links open within your {@link android.webkit.WebView}. You can then allow the user to navigate
248backward and forward through their web page history that's maintained by your {@link
249android.webkit.WebView}.</p>
250
251<p>To open links clicked by the user, simply provide a {@link
252android.webkit.WebViewClient} for your {@link android.webkit.WebView}, using {@link
253android.webkit.WebView#setWebViewClient(WebViewClient) setWebViewClient()}. For example:</p>
254
255<pre>
256WebView myWebView = (WebView) findViewById(R.id.webview);
257myWebView.{@link android.webkit.WebView#setWebViewClient(WebViewClient) setWebViewClient}(new WebViewClient());
258</pre>
259
260<p>That's it. Now all links the user clicks load in your {@link android.webkit.WebView}.</p>
261
262<p>If you want more control over where a clicked link load, create your own {@link
263android.webkit.WebViewClient} that overrides the {@link
264android.webkit.WebViewClient#shouldOverrideUrlLoading(WebView,String)
265shouldOverrideUrlLoading()} method. For example:</p>
266
267<pre>
268private class MyWebViewClient extends WebViewClient {
269    &#64;Override
270    public boolean {@link android.webkit.WebViewClient#shouldOverrideUrlLoading(WebView,String) shouldOverrideUrlLoading}(WebView view, String url) {
271        if (Uri.parse(url).getHost().equals("www.example.com")) {
272            // This is my web site, so do not override; let my WebView load the page
273            return false;
274        }
275        // Otherwise, the link is not for a page on my site, so launch another Activity that handles URLs
276        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
277        startActivity(intent);
278        return true;
279    }
280}
281</pre>
282
283<p>Then create an instance of this new {@link android.webkit.WebViewClient} for the {@link
284android.webkit.WebView}:</p>
285
286<pre>
287WebView myWebView = (WebView) findViewById(R.id.webview);
288myWebView.{@link android.webkit.WebView#setWebViewClient(WebViewClient) setWebViewClient}(new MyWebViewClient());
289</pre>
290
291<p>Now when the user clicks a link, the system calls
292{@link android.webkit.WebViewClient#shouldOverrideUrlLoading(WebView,String)
293shouldOverrideUrlLoading()}, which checks whether the URL host matches a specific domain (as defined
294above). If it does match, then the method returns false in order to <em>not</em> override the URL
295loading (it allows the {@link android.webkit.WebView} to load the URL as usual). If the URL host
296does not match, then an {@link android.content.Intent} is created to
297launch the default Activity for handling URLs (which resolves to the user's default web
298browser).</p>
299
300
301
302
303<h3 id="NavigatingHistory">Navigating web page history</h3>
304
305<p>When your {@link android.webkit.WebView} overrides URL loading, it automatically accumulates a
306history of visited web
307pages. You can navigate backward and forward through the history with {@link
308android.webkit.WebView#goBack()} and {@link android.webkit.WebView#goForward()}.</p>
309
310<p>For example, here's how your {@link android.app.Activity} can use the device <em>Back</em> button
311to navigate backward:</p>
312
313<pre>
314&#64;Override
315public boolean {@link android.app.Activity#onKeyDown(int,KeyEvent) onKeyDown}(int keyCode, KeyEvent event) {
316    // Check if the key event was the Back button and if there's history
317    if ((keyCode == KeyEvent.KEYCODE_BACK) &amp;&amp; myWebView.{@link android.webkit.WebView#canGoBack() canGoBack}()) {
318        myWebView.{@link android.webkit.WebView#goBack() goBack}();
319        return true;
320    }
321    // If it wasn't the Back key or there's no web page history, bubble up to the default
322    // system behavior (probably exit the activity)
323    return super.onKeyDown(keyCode, event);
324}
325</pre>
326
327<p>The {@link android.webkit.WebView#canGoBack()} method returns
328true if there is actually web page history for the user to visit. Likewise, you can use {@link
329android.webkit.WebView#canGoForward()} to check whether there is a forward history. If you don't
330perform this check, then once the user reaches the end of the history, {@link
331android.webkit.WebView#goBack()} or {@link android.webkit.WebView#goForward()} does nothing.</p>
332
333
334
335
336
337
338