blob: d0b41d3387b18a419f4453a852d496570ee63ab1 [file] [log] [blame]
Scott Mainf284d492012-07-31 09:46:52 -07001page.title=Android 3.0 APIs
Scott Main50e990c2012-06-21 17:14:39 -07002sdk.platform.version=3.0
3sdk.platform.apiLevel=11
4@jd:body
5
6<div id="qv-wrapper">
7<div id="qv">
8
9<h2>In this document</h2>
10<ol>
11 <li><a href="#api">API Overview</a></li>
12 <li><a href="#api-level">API Level</a></li>
13</ol>
14
15<h2>Reference</h2>
16<ol>
17<li><a
18href="{@docRoot}sdk/api_diff/11/changes.html">API
19Differences Report &raquo;</a> </li>
20</ol>
21
22</div>
23</div>
24
25
26<p><em>API Level:</em>&nbsp;<strong>{@sdkPlatformApiLevel}</strong></p>
27
Scott Main57655252012-11-13 00:44:17 -080028<p>For developers, the Android {@sdkPlatformVersion} platform
29({@link android.os.Build.VERSION_CODES#HONEYCOMB}) is available as a downloadable
Scott Main50e990c2012-06-21 17:14:39 -070030component for the Android SDK. The downloadable platform includes an Android library and system
31image, as well as a set of emulator skins and more. The downloadable platform includes no external
32libraries.</p>
33
34<p>For developers, the Android {@sdkPlatformVersion} platform is available as a
35downloadable component for the Android SDK. The downloadable platform includes
36an Android library and system image, as well as a set of emulator skins and
37more. To get started developing or testing against Android {@sdkPlatformVersion},
38use the Android SDK Manager to download the platform into your SDK.</p>
39
40
41
42
43
44
45<h2 id="#api">API Overview</h2>
46
47<p>The sections below provide a technical overview of what's new for developers in Android 3.0,
48including new features and changes in the framework API since the previous version.</p>
49
50
51
52
53
54<h3>Fragments</h3>
55
56<p>A fragment is a new framework component that allows you to separate distinct elements of an
57activity into self-contained modules that define their own UI and lifecycle. To create a
58fragment, you must extend the {@link android.app.Fragment} class and implement several lifecycle
59callback methods, similar to an {@link android.app.Activity}. You can then combine multiple
60fragments in a single activity to build a multi-pane UI in which each
61pane manages its own lifecycle and user inputs.</p>
62
63<p>You can also use a fragment without providing a UI and instead use the fragment as a worker
64for the activity, such as to manage the progress of a download that occurs only while the
65activity is running.</p>
66
67<p>Additionally:</p>
68
69<ul>
70 <li>Fragments are self-contained and you can reuse them in multiple activities</li>
71 <li>You can add, remove, replace and animate fragments inside the activity</li>
72 <li>You can add fragments to a back stack managed by the activity, preserving the state of
73fragments as they are changed and allowing the user to navigate backward through the different
74states</li>
75 <li>By <a
76href="{@docRoot}guide/topics/resources/providing-resources.html#AlternativeResources">providing
77alternative layouts</a>, you can mix and match fragments, based
78on the screen size and orientation</li>
79 <li>Fragments have direct access to their container activity and can contribute items to the
80activity's Action Bar (discussed next)</li>
81</ul>
82
83<p>To manage the fragments in your activity, you must use the {@link
84android.app.FragmentManager}, which provides several APIs for interacting with fragments, such
85as finding fragments in the activity and popping fragments off the back stack to restore their
86previous state.</p>
87
88<p>To perform a transaction, such as add or remove a fragment, you must create a {@link
89android.app.FragmentTransaction}. You can then call methods such as {@link
90android.app.FragmentTransaction#add add()} {@link android.app.FragmentTransaction#remove
91remove()}, or {@link android.app.FragmentTransaction#replace replace()}. Once you've applied all
92the changes you want to perform for the transaction, you must call {@link
93android.app.FragmentTransaction#commit commit()} and the system applies the fragment transaction to
94the activity.</p>
95
96<p>For more information about using fragments, read the <a
97href="{@docRoot}guide/components/fragments.html">Fragments</a> documentation. Several
98samples are also available in the <a
99href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/index.html#Fragment">
100API Demos</a> application.</p>
101
102
103
104
105<h3>Action Bar</h3>
106
107<p>The Action Bar is a replacement for the traditional title bar at the top of the activity window.
108It includes the application logo in the left corner and provides a new interface for items in the
109<a href="{@docRoot}guide/topics/ui/menus.html#options-menu">Options Menu</a>. Additionally, the
110Action Bar allows you to:</p>
111
112<ul>
113 <li>Add menu items directly in the Action Bar&mdash;as "action items."
114 <p>In your XML declaration for the menu item, include the {@code
115android:showAsAction} attribute with a value of {@code "ifRoom"}. When there's enough room, the menu
116item appears directly in the Action Bar. Otherwise, the item is placed in the
117overflow menu, revealed by the menu icon on the right side of the Action Bar.</p></li>
118
119 <li>Replace an action item with a widget (such as a search box)&mdash;creating an
120"action view."
121 <p>In the XML declaration for the menu item, add the {@code android:actionViewLayout} attribute
122with a layout resource or the {@code android:actionViewClass} attribute with the class name of a
123widget. (You must also declare the {@code android:showAsAction} attribute so that the item appears
124in the Action Bar.) If there's not enough room in the Action Bar and the item appears in the
125overflow menu, it behaves like a regular menu item and does not show the widget.</p></li>
126
127 <li>Add an action to the application logo and replace it with a custom logo
128 <p>The application logo is automatically assigned the {@code android.R.id.home} ID,
129which the system delivers to your activity's {@link android.app.Activity#onOptionsItemSelected
130onOptionsItemSelected()} callback when touched. Simply respond to this ID in your callback
131method to perform an action such as go to your application's "home" activity.</p>
132 <p>To replace the icon with a logo, specify your application logo in the manifest file with the
133<a href="{@docRoot}guide/topics/manifest/application-element.html#logo">{@code android:logo}</a>
134attribute, then call {@link android.app.ActionBar#setDisplayUseLogoEnabled
135setDisplayUseLogoEnabled(true)} in your activity.</p></li>
136
137 <li>Add breadcrumbs to navigate backward through the back stack of fragments</li>
138 <li>Add tabs or a drop-down list to navigate through fragments</li>
139 <li>Customize the Action Bar with themes and backgrounds</li>
140</ul>
141
142<p>The Action Bar is standard for all applications that use the new holographic theme, which is
143also standard when you set either the <a
144href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#min">{@code
145android:minSdkVersion}</a> or <a
146href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#target">{@code
147android:targetSdkVersion}</a> to {@code "11"}.</p>
148
149<p>For more information about the Action Bar, read the <a
150href="{@docRoot}guide/topics/ui/actionbar.html">Action Bar</a> documentation. Several
151samples are also available in the <a
152href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/index.html#ActionBar">
153API Demos</a> application.</p>
154
155
156
157
158<h3>System clipboard</h3>
159
160<p>Applications can now copy and paste data (beyond mere text) to and from the system-wide
161clipboard. Clipped data can be plain text, a URI, or an intent.</p>
162
163<p>By providing the system access to the data you want the user to copy, through a content provider,
164the user can copy complex content (such as an image or data structure) from your application and
165paste it into another application that supports that type of content.</p>
166
167<p>To start using the clipboard, get the global {@link android.content.ClipboardManager} object
168by calling {@link android.content.Context#getSystemService getSystemService(CLIPBOARD_SERVICE)}.</p>
169
170<p>To copy an item to the clipboard, you need to create a new {@link
171android.content.ClipData} object, which holds one or more {@link android.content.ClipData.Item}
172objects, each describing a single entity. To create a {@link android.content.ClipData} object
173containing just one {@link android.content.ClipData.Item}, you can use one of the helper methods,
174such as {@link android.content.ClipData#newPlainText newPlainText()}, {@link
175android.content.ClipData#newUri newUri()}, and {@link android.content.ClipData#newIntent
176newIntent()}, which each return a {@link android.content.ClipData} object pre-loaded with the
177{@link android.content.ClipData.Item} you provide.</p>
178
179<p>To add the {@link android.content.ClipData} to the clipboard, pass it to {@link
180android.content.ClipboardManager#setPrimaryClip setPrimaryClip()} for your instance of {@link
181android.content.ClipboardManager}.</p>
182
183<p>You can then read a file from the clipboard (in order to paste it) by calling {@link
184android.content.ClipboardManager#getPrimaryClip()} on the {@link
185android.content.ClipboardManager}. Handling the {@link android.content.ClipData} you receive can
186be complicated and you need to be sure you can actually handle the data type in the clipboard
187before attempting to paste it.</p>
188
189<p>The clipboard holds only one piece of clipped data (a {@link android.content.ClipData}
190object) at a time, but one {@link android.content.ClipData} can contain multiple {@link
191android.content.ClipData.Item}s.</p>
192
193<p>For more information, read the <a href="{@docRoot}guide/topics/text/copy-paste.html">Copy
194and Paste</a> documentation. You can also see a simple implementation of copy and paste in the API Demos
195sample and a more complete implementation in the Note Pad sample.</p>
196
197
198
199
200<h3>Drag and drop</h3>
201
202<p>New APIs simplify drag and drop operations in your application's user interface. A drag
203operation is the transfer of some kind of data&mdash;carried in a {@link android.content.ClipData}
204object&mdash;from one place to another. The start and end point for the drag operation is a {@link
205android.view.View}, so the APIs that directly handle the drag and drop operations are
206in the {@link android.view.View} class.</p>
207
208<p>A drag and drop operation has a lifecycle that's defined by several drag actions&mdash;each
209defined by a {@link android.view.DragEvent} object&mdash;such as {@link
210android.view.DragEvent#ACTION_DRAG_STARTED}, {@link android.view.DragEvent#ACTION_DRAG_ENTERED}, and
211{@link android.view.DragEvent#ACTION_DROP}. Each view that wants to participate in a drag
212operation can listen for these actions.</p>
213
214<p>To begin dragging content in your activity, call {@link android.view.View#startDrag startDrag()}
215on a {@link android.view.View}, providing a {@link android.content.ClipData} object that represents
216the data to drag, a {@link android.view.View.DragShadowBuilder} to facilitate the "shadow"
217that users see under their fingers while dragging, and an {@link java.lang.Object} that can share
218information about the drag object with views that may receive the object.</p>
219
220<p>To accept a drag object in a {@link android.view.View} (receive the "drop"), register the view
221with an {@link android.view.View.OnDragListener OnDragListener} by calling {@link
222android.view.View#setOnDragListener setOnDragListener()}. When a drag event occurs on the view, the
223system calls {@link android.view.View.OnDragListener#onDrag onDrag()} for the {@link
224android.view.View.OnDragListener OnDragListener}, which receives a {@link android.view.DragEvent}
225describing the type of drag action has occurred (such as {@link
226android.view.DragEvent#ACTION_DRAG_STARTED}, {@link android.view.DragEvent#ACTION_DRAG_ENTERED}, and
227{@link android.view.DragEvent#ACTION_DROP}). During a drag, the system repeatedly calls {@link
228android.view.View.OnDragListener#onDrag onDrag()} for the view underneath the drag, to deliver a
229stream of drag events. The receiving view can inquire the event type delivered to {@link
230android.view.View#onDragEvent onDragEvent()} by calling {@link android.view.DragEvent#getAction
231getAction()} on the {@link android.view.DragEvent}.</p>
232
233<p class="note"><strong>Note:</strong> Although a drag event may carry a {@link
234android.content.ClipData} object, this is not related to the system clipboard. A drag and drop
235operation should never put the dragged data in the system clipboard.</p>
236
237<p>For more information, read the <a href="{@docRoot}guide/topics/ui/drag-drop.html">Dragging and
238Dropping</a> documentation. You can also see an implementation of drag and drop in the <a
239href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/view/DragAndDropDemo.html">
240API Demos</a> application and the <a
241href="{@docRoot}resources/samples/HoneycombGallery/index.html">Honeycomb Gallery</a>
242application.</p>
243
244
245
246<h3>App widgets</h3>
247
248<p>Android 3.0 supports several new widget classes for more interactive app widgets on the users
249Home screen, including: {@link android.widget.GridView}, {@link android.widget.ListView}, {@link
250android.widget.StackView}, {@link android.widget.ViewFlipper}, and {@link
251android.widget.AdapterViewFlipper}.</p>
252
253<p>More importantly, you can use the new {@link android.widget.RemoteViewsService} to create app
254widgets with collections, using widgets such as {@link android.widget.GridView}, {@link
255android.widget.ListView}, and {@link android.widget.StackView} that are backed by remote data,
256such as from a content provider.</p>
257
258<p>The {@link android.appwidget.AppWidgetProviderInfo} class (defined in XML with an {@code
259&lt;appwidget-provider&gt;} element) also supports two new fields: {@link
260android.appwidget.AppWidgetProviderInfo#autoAdvanceViewId} and {@link
261android.appwidget.AppWidgetProviderInfo#previewImage}. The {@link
262android.appwidget.AppWidgetProviderInfo#autoAdvanceViewId} field lets you specify the view ID of the
263app widget subview that should be auto-advanced by the app widget’s host. The
264{@link android.appwidget.AppWidgetProviderInfo#previewImage} field specifies a preview of what the
265app widget looks like and is shown to the user from the widget picker. If this field is not
266supplied, the app widget's icon is used for the preview.</p>
267
268<p>To help create a preview image for your app widget (to specify in the {@link
269android.appwidget.AppWidgetProviderInfo#previewImage} field), the Android emulator includes an
270application called "Widget Preview." To create a preview image, launch this application, select the
271app widget for your application and set it up how you'd like your preview image to appear, then save
272it and place it in your application's drawable resources.</p>
273
274<p>You can see an implementation of the new app widget features in the <a
275href="{@docRoot}resources/samples/StackWidget/index.html">StackView App Widget</a> and <a
276href="{@docRoot}resources/samples/WeatherListWidget/index.html">Weather List Widget</a>
277applications.</p>
278
279
280
281<h3>Status bar notifications</h3>
282
283<p>The {@link android.app.Notification} APIs have been extended to support more content-rich status
284bar notifications, plus a new {@link android.app.Notification.Builder} class allows you to easily
285create {@link android.app.Notification} objects.</p>
286<p>New features include:</p>
287<ul>
288 <li>Support for a large icon in the notification, using {@link
289android.app.Notification.Builder#setLargeIcon setLargeIcon()}. This is usually for
290social applications to show the contact photo of the person who is the source of the
291notification or for media apps to show an album thumbnail.</li>
292 <li>Support for custom layouts in the status bar ticker, using {@link
293android.app.Notification.Builder#setTicker(CharSequence,RemoteViews) setTicker()}.</li>
294 <li>Support for custom notification layouts to include buttons with {@link
295android.app.PendingIntent}s, for more interactive notification widgets. For example, a
296notification can control music playback without starting an activity.</li>
297</ul>
298
299
300
301<h3>Content loaders</h3>
302
303<p>New framework APIs facilitate asynchronous loading of data using the {@link
304android.content.Loader} class. You can use it in combination with UI components such as views and
305fragments to dynamically load data from worker threads. The {@link
306android.content.CursorLoader} subclass is specially designed to help you do so for data backed by
307a {@link android.content.ContentProvider}.</p>
308
309<p>All you need to do is implement the {@link android.app.LoaderManager.LoaderCallbacks
310LoaderCallbacks} interface to receive callbacks when a new loader is requested or the data has
311changed, then call {@link android.app.LoaderManager#initLoader initLoader()} to initialize the
312loader for your activity or fragment.</p>
313
314<p>For more information, read the <a
315href="{@docRoot}guide/components/loaders.html">Loaders</a> documentation. You can also see
316example code using loaders in the <a
317href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/LoaderCursor.html">LoaderCursor</a>
318and <a
319href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/LoaderThrottle.html">
320LoaderThrottle</a> samples.</p>
321
322
323
324<h3>Bluetooth A2DP and headset APIs</h3>
325
326<p>Android now includes APIs for applications to verify the state of connected Bluetooth A2DP and
327headset profile devices. For example, applications can identify when a Bluetooth headset is
328connected for listening to music and notify the user as appropriate. Applications can also receive
329broadcasts for vendor specific AT commands and notify the user about the state of the connected
330device, such as when the connected device's battery is low.</p>
331
332<p>You can initialize the respective {@link android.bluetooth.BluetoothProfile} by calling {@link
333android.bluetooth.BluetoothAdapter#getProfileProxy getProfileProxy()} with either the {@link
334android.bluetooth.BluetoothProfile#A2DP} or {@link android.bluetooth.BluetoothProfile#HEADSET}
335profile constant and a {@link android.bluetooth.BluetoothProfile.ServiceListener} to receive
336callbacks when the Bluetooth client is connected or disconnected.</p>
337
338
339
340
341<h3 id="animation">Animation framework</h3>
342
343<p>An all new flexible animation framework allows you to animate arbitrary properties of any object
344(View, Drawable, Fragment, Object, or anything else). It allows you to define several aspects of an
345animation, such as:</p>
346<ul>
347 <li>Duration</li>
348 <li>Repeat amount and behavior</li>
349 <li>Type of time interpolation</li>
350 <li>Animator sets to play animations together, sequentially, or after specified delays</li>
351 <li>Frame refresh delay</li>
352</ul>
353
354 <p>You can define these animation aspects, and others, for an object's int, float, and hexadecimal
355color values, by default. That is, when an object has a property field for one of these types, you
356can change its value over time to affect an animation. To animate any other type of value, you tell
357the system how to calculate the values for that given type, by implementing the {@link
358android.animation.TypeEvaluator} interface.</p>
359
360<p>There are two animators you can use to animate the values of a property: {@link
361android.animation.ValueAnimator} and {@link android.animation.ObjectAnimator}. The {@link
362android.animation.ValueAnimator} computes the animation values, but is not aware of the specific
363object or property that is animated as a result. It simply performs the calculations, and you must
364listen for the updates and process the data with your own logic. The {@link
365android.animation.ObjectAnimator} is a subclass of {@link android.animation.ValueAnimator} and
366allows you to set the object and property to animate, and it handles all animation work.
367That is, you give the {@link android.animation.ObjectAnimator} the object to animate, the
368property of the object to change over time, and a set of values to apply to the property over
369time, then start the animation.</p>
370
371<p>Additionally, the {@link android.animation.LayoutTransition} class enables automatic transition
372animations for changes you make to your activity layout. To enable transitions for part of the
373layout, create a {@link android.animation.LayoutTransition} object and set it on
374any {@link android.view.ViewGroup} by calling {@link
375android.view.ViewGroup#setLayoutTransition setLayoutTransition()}. This causes default
376animations to run whenever items are added to or removed from the group. To specify custom
377animations, call {@link android.animation.LayoutTransition#setAnimator setAnimator()} on the {@link
378android.animation.LayoutTransition} and provide a custom {@link android.animation.Animator},
379such as a {@link android.animation.ValueAnimator} or {@link android.animation.ObjectAnimator}
380discussed above.</p>
381
382<p>For more information, see the <a
383href="{@docRoot}guide/topics/graphics/prop-animation.html">Property Animation</a> documentation. You can
384also see several samples using the animation APIs in the <a
385href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/animation/index.html">API
386Demos</a> application.</p>
387
388
389
390
391<h3>Extended UI framework</h3>
392
393<ul>
394
395 <li><b>Multiple-choice selection for ListView and GridView</b>
396
397<p>New {@link android.widget.AbsListView#CHOICE_MODE_MULTIPLE_MODAL} mode for {@link
398android.widget.AbsListView#setChoiceMode setChoiceMode()} allows users to select multiple items
399from a {@link android.widget.ListView} or {@link android.widget.GridView}. When used in
400conjunction with the Action Bar, users can select multiple items and then select the action to
401perform from a list of options in the Action Bar (which has transformed into a Multi-choice
402Action Mode).</p>
403
404<p>To enable multiple-choice selection, call {@link
405android.widget.AbsListView#setChoiceMode setChoiceMode(CHOICE_MODE_MULTIPLE_MODAL)} and register a
406{@link android.widget.AbsListView.MultiChoiceModeListener MultiChoiceModeListener} with {@link
407android.widget.AbsListView#setMultiChoiceModeListener setMultiChoiceModeListener()}.</p>
408
409<p>When the user performs a long-press on an item, the Action Bar switches to the Multi-choice
410Action Mode. The system notifies the {@link android.widget.AbsListView.MultiChoiceModeListener
411MultiChoiceModeListener} when items are selected by calling {@link
412android.widget.AbsListView.MultiChoiceModeListener#onItemCheckedStateChanged
413onItemCheckedStateChanged()}.</p>
414
415<p>For an example of multiple-choice selection, see the <a
416href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/view/List15.html">List15.
417java</a>
418class in the API Demos sample application.</p>
419 </li>
420
421
422 <li><b>New APIs to transform views</b>
423
424 <p>New APIs allow you to easily apply 2D and 3D transformations to views in your activity
425layout. New transformations are made possible with a set of object properties that define the view's
426layout position, orientation, transparency and more.</p>
427 <p>New methods to set the view properties include: {@link android.view.View#setAlpha
428setAlpha()}, {@link
429android.view.View#setBottom setBottom()}, {@link android.view.View#setLeft setLeft()}, {@link
430android.view.View#setRight setRight()}, {@link android.view.View#setBottom setBottom()}, {@link
431android.view.View#setPivotX setPivotX()}, {@link android.view.View#setPivotY setPivotY()}, {@link
432android.view.View#setRotationX setRotationX()}, {@link android.view.View#setRotationY
433setRotationY()}, {@link android.view.View#setScaleX setScaleX()}, {@link android.view.View#setScaleY
434setScaleY()}, {@link android.view.View#setAlpha setAlpha()}, and others.</p>
435
436 <p>Some methods also have a corresponding XML attribute that you can specify in your layout
437file, to apply a default transformation. Available attributes include: {@code translationX}, {@code
438translationY}, {@code rotation},
439{@code rotationX}, {@code rotationY}, {@code scaleX}, {@code scaleY}, {@code transformPivotX},
440{@code transformPivotY}, and {@code alpha}.</p>
441
442 <p>Using some of these new view properties in combination with the new <a
443href="#animation">animation framework</a> (discussed
444above), you can easily apply some fancy animations to your views. For example, to rotate a
445view on its y-axis, supply {@link android.animation.ObjectAnimator} with the {@link
446android.view.View}, the "rotationY" property, and the start and end values:</p>
447<pre>
448ObjectAnimator animator = ObjectAnimator.ofFloat(myView, "rotationY", 0, 360);
449animator.setDuration(2000);
450animator.start();
451</pre>
452 </li>
453
454
455 <li><b>New holographic themes</b>
456
457 <p>The standard system widgets and overall look have been redesigned and incorporate a new
458"holographic" user interface theme. The system applies the new theme
459using the standard <a href="{@docRoot}guide/topics/ui/themes.html">style and theme</a> system.</p>
460
461<p>Any application that targets the Android 3.0 platform&mdash;by setting either the <a
462href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#min">{@code android:minSdkVersion}</a>
463or <a
464href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#target">{@code
465android:targetSdkVersion}</a> value to {@code "11"}&mdash;inherits the holographic theme by default.
466However, if your application also applies its own theme, then your theme will override the
467holographic theme, unless you update your styles to inherit the holographic theme.</p>
468
469<p>To apply the holographic theme to individual activities or to inherit them in your own theme
470definitions, use one of several new {@link android.R.style#Theme_Holo Theme.Holo}
471themes. If your application is compatible with version of Android lower than 3.0 and applies
472custom themes, then you should <a
473href="{@docRoot}guide/topics/ui/themes.html#SelectATheme">select a theme based on platform
474version</a>.</p>
475
476 </li>
477
478
479 <li><b>New widgets</b>
480
481 <ul>
482 <li>{@link android.widget.AdapterViewAnimator}
483 <p>Base class for an {@link android.widget.AdapterView} that performs animations when switching
484 between its views.</p></li>
485
486 <li>{@link android.widget.AdapterViewFlipper}
487 <p>Simple {@link android.widget.ViewAnimator} that animates between two or more views that have
488 been added to it. Only one child is shown at a time. If requested, it can automatically flip
489 between
490 each child at a regular interval.</p></li>
491
492 <li>{@link android.widget.CalendarView}
493 <p>Allows users to select dates from a calendar by touching the date and can scroll or fling the
494calendar to a desired date. You can configure the range of dates available in the widget.</p></li>
495
496 <li>{@link android.widget.ListPopupWindow}
497 <p>Anchors itself to a host view and displays a list of choices, such as for a list of
498 suggestions when typing into an {@link android.widget.EditText} view.</p></li>
499
500 <li>{@link android.widget.NumberPicker}
501 <p>Enables the user to select a number from a predefined range. The widget presents an input
502field and up and down buttons for selecting a number. Touching the input field allows the user to
503scroll through values or touch again to directly edit the current value. It also allows you to map
504positions to strings, so that the corresponding string is displayed instead of the index
505position.</p></li>
506
507 <li>{@link android.widget.PopupMenu}
508 <p>Displays a {@link android.view.Menu} in a modal popup window that's anchored to a view. The
509popup appears below the anchor view if there is room, or above it if there is not. If the IME (soft
510keyboard) is visible, the popup does not overlap the IME it until the user touches the
511menu.</p></li>
512
513 <li>{@link android.widget.SearchView}
514 <p>Provides a search box that you can configure to deliver search queries to a specified
515activity and display search suggestions (in the same manner as the traditional search dialog). This
516widget is particularly useful for offering a search widget in the Action Bar. For more information,
517see <a href="{@docRoot}guide/topics/search/search-dialog.html">Creating a Search Interface.</p></li>
518
519 <li>{@link android.widget.StackView}
520 <p>A view that displays its children in a 3D stack and allows users to swipe through
521 views like a rolodex.</p></li>
522
523 </ul>
524 </li>
525
526</ul>
527
528
529
530<h3>Graphics</h3>
531
532<ul>
533 <li><b>Hardware accelerated 2D graphics</b>
534
535<p>You can now enable the OpenGL renderer for your application by setting {@code
536android:hardwareAccelerated="true"} in your manifest element's <a
537href="{@docRoot}guide/topics/manifest/application-element.html">{@code &lt;application&gt;}</a>
538element or for individual <a
539href="{@docRoot}guide/topics/manifest/activity-element.html">{@code &lt;activity&gt;}</a>
540elements.</p>
541
542<p>This flag helps applications by making them draw faster. This results in smoother animations,
543smoother scrolling, and overall better performance and response to user interaction.</p></li>
544
545
546 <li><b>View support for hardware and software layers</b>
547
548 <p>By default, a {@link android.view.View} has no layer specified. You can specify that the
549view be backed by either a hardware or software layer, specified by values {@link
550android.view.View#LAYER_TYPE_HARDWARE} and {@link android.view.View#LAYER_TYPE_SOFTWARE}, using
551{@link android.view.View#setLayerType setLayerType()} or the <a
552href="{@docRoot}reference/android/view/View.html#attr_android:layerType">{@code layerType}</a>
553attribute.</p>
554 <p>A hardware layer is backed by a hardware specific texture (generally Frame Buffer Objects or
555FBO on OpenGL hardware) and causes the view to be rendered using Android's hardware rendering
556pipeline, but only if hardware acceleration is turned on for the view hierarchy. When hardware
557acceleration is turned off, hardware layers behave exactly as software layers.</p>
558 <p>A software layer is backed by a bitmap and causes the view to be rendered using Android's
559software rendering pipeline, even if hardware acceleration is enabled. Software layers should be
560avoided when the affected view tree updates often. Every update will require to re-render the
561software layer, which can potentially be slow.</p>
562 <p>For more information, see the {@link android.view.View#LAYER_TYPE_HARDWARE} and {@link
563android.view.View#LAYER_TYPE_SOFTWARE} documentation.</p>
564 </li>
565
566
567 <li><b>Renderscript 3D graphics engine</b>
568
569<p>Renderscript is a runtime 3D framework that provides both an API for building 3D scenes as well
570as a special, platform-independent shader language for maximum performance. Using Renderscript, you
571can accelerate graphics operations and data processing. Renderscript is an ideal way to create
572high-performance 3D effects for applications, wallpapers, carousels, and more.</p>
573<p>For more information, see the <a
Scott Mainb47fa162013-02-05 14:23:13 -0800574href="{@docRoot}guide/topics/renderscript/index.html">3D Rendering and Computation with
Scott Main50e990c2012-06-21 17:14:39 -0700575Renderscript</a> documentation.</p></li>
576</ul>
577
578
579
580
581<h3>Media</h3>
582
583
584<ul>
585
586 <li><b>Time lapse video</b>
587
588<p>Camcorder APIs now support the ability to record time lapse video. The {@link
589android.media.MediaRecorder#setCaptureRate setCaptureRate()} sets the rate at which frames
590should be captured.</p></li>
591
592 <li><b>Texture support for image streams</b>
593
594<p>New {@link android.graphics.SurfaceTexture} allows you to capture an image stream as an OpenGL ES
595texture. By calling {@link android.hardware.Camera#setPreviewTexture setPreviewTexture()} for your
596{@link android.hardware.Camera} instance, you can specify the {@link
597android.graphics.SurfaceTexture} upon which to draw video playback or preview frames from the
598camera.</p></li>
599
600 <li><b>HTTP Live streaming</b>
601
602<p>Applications can now pass an M3U playlist URL to the media framework to begin an HTTP Live
603streaming session. The media framework supports most of the HTTP Live streaming specification,
604including adaptive bit rate. See the <a
605href="{@docRoot}guide/appendix/media-formats.html">Supported Media Formats</a> document for
606more information.</p></li>
607
608 <li><b>EXIF data</b>
609
610<p>The {@link android.media.ExifInterface} includes new fields for photo aperture, ISO, and exposure
611time.</p></li>
612
613 <li><b>Camcorder profiles</b>
614
615<p>New {@link android.media.CamcorderProfile#hasProfile hasProfile()} method and several video
616quality profiles (such as {@link android.media.CamcorderProfile#QUALITY_1080P}, {@link
617android.media.CamcorderProfile#QUALITY_720P}, {@link
618android.media.CamcorderProfile#QUALITY_CIF}, and others) allow you to determine camcorder
619quality options.</p></li>
620
621 <li><b>Digital media file transfer</b>
622
623<p>The platform includes built-in support for Media/Picture Transfer Protocol (MTP/PTP) over USB,
624which lets users easily transfer any type of media files between devices and to a host computer.
625Developers can build on this support, creating applications that let users create or manage rich
626media files that they may want to transfer or share across devices. </p></li>
627
628 <li><b>Digital rights management (DRM)</b>
629
630<p>New extensible digital rights management (DRM) framework for checking and enforcing digital
631rights. It's implemented in two architectural layers:</p>
632<ul>
633 <li>A DRM framework API, which is exposed to applications and runs through the Dalvik VM for
634standard applications.</li>
635 <li>A native code DRM manager that implements the framework API and exposes an interface for DRM
636plug-ins to handle rights management and decryption for various DRM schemes.</li>
637</ul>
638
639<p>For application developers, the framework offers an abstract, unified API that simplifies the
640management of protected content. The API hides the complexity of DRM operations and allows a
641consistent operation mode for both protected and unprotected content, and across a variety of DRM
642schemes.</p>
643
644<p>For device manufacturers, content owners, and Internet digital media providers the DRM
645framework?s plugin API provides a means of adding support for a DRM scheme of choice into the
646Android system, for secure enforcement of content protection.</p>
647
648<p>The preview release does not provide any native DRM plug-ins for checking and enforcing digital
649rights. However, device manufacturers may ship DRM plug-ins with their devices.</p>
650
651<p>You can find all of the DRM APIs in the {@link android.drm} package.</p></li>
652
653</ul>
654
655
656
657<h3>Keyboard support</h3>
658
659<ul>
660<li>Support for Control, Meta, Caps Lock, Num Lock and Scroll Lock modifiers. For more information,
661see {@link android.view.KeyEvent#META_CTRL_ON} and related fields.</li>
662
663<li>Support for full desktop-style keyboards, including support for keys such as Escape, Home, End,
664Delete and others. You can determine whether key events are coming from a full keyboard by
665querying {@link android.view.KeyCharacterMap#getKeyboardType()} and checking for {@link
666android.view.KeyCharacterMap#FULL KeyCharacterMap.FULL}</li>
667
668<li>{@link android.widget.TextView} now supports keyboard-based cut, copy, paste, and select-all,
669using the key combinations Ctrl+X, Ctrl+C, Ctrl+V, and Ctrl+A. It also supports PageUp/PageDown,
670Home/End, and keyboard-based text selection.</li>
671
672<li>{@link android.view.KeyEvent} adds several new methods to make it easier to check the key
673modifier state correctly and consistently. See {@link android.view.KeyEvent#hasModifiers(int)},
674{@link android.view.KeyEvent#hasNoModifiers()},
675{@link android.view.KeyEvent#metaStateHasModifiers(int,int) metaStateHasModifiers()},
676{@link android.view.KeyEvent#metaStateHasNoModifiers(int) metaStateHasNoModifiers()}.</li>
677
678<li>Applications can implement custom keyboard shortcuts by subclassing {@link
679android.app.Activity}, {@link android.app.Dialog}, or {@link android.view.View} and implementing
680{@link android.app.Activity#onKeyShortcut onKeyShortcut()}. The framework calls this method
681whenever a key is combined with Ctrl key. When creating an <a
682href="{@docRoot}guide/topics/ui/menus.html#options-menu">Options Menu</a>, you can register keyboard
683shortcuts by setting either the {@code android:alphabeticShortcut} or {@code
684android:numericShortcut} attribute for each <a
685href="{@docRoot}guide/topics/resources/menu-resource.html#item-element">{@code &lt;item&gt;}</a>
686element (or with {@link android.view.MenuItem#setShortcut setShortcut()}).</li>
687
688<li>Android 3.0 includes a new "virtual keyboard" device with the id {@link
689android.view.KeyCharacterMap#VIRTUAL_KEYBOARD KeyCharacterMap.VIRTUAL_KEYBOARD}. The virtual
690keyboard has a desktop-style US key map which is useful for synthesizing key events for testing
691input.</li>
692
693</ul>
694
695
696
697
698<h3>Split touch events</h3>
699
700<p>Previously, only a single view could accept touch events at one time. Android 3.0
701adds support for splitting touch events across views and even windows, so different views can accept
702simultaneous touch events.</p>
703
704<p>Split touch events is enabled by default when an application targets
705Android 3.0. That is, when the application has set either the <a
706href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#min">{@code android:minSdkVersion}</a>
707or <a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#target">{@code
708android:targetSdkVersion}</a> attribute's value to {@code "11"}.</p>
709
710<p>However, the following properties allow you to disable split touch events across views inside
711specific view groups and across windows.</p>
712
713<ul>
714<li>The {@link android.R.attr#splitMotionEvents android:splitMotionEvents} attribute for view groups
715allows you to disable split touch events that occur between child views in a layout. For example:
716<pre>
717&lt;LinearLayout android:splitMotionEvents="false" ... >
718 ...
719&lt;/LinearLayout>
720</pre>
721<p>This way, child views in the linear layout cannot split touch events&mdash;only one view can
722receive touch events at a time.</p>
723</li>
724
725<li>The {@link android.R.attr#windowEnableSplitTouch android:windowEnableSplitTouch} style property
726allows you to disable split touch events across windows, by applying it to a theme for the activity
727or entire application. For example:
728<pre>
729&lt;style name="NoSplitMotionEvents" parent="android:Theme.Holo">
730 &lt;item name="android:windowEnableSplitTouch">false&lt;/item>
731 ...
732&lt;/style>
733</pre>
734<p>When this theme is applied to an <a
735href="{@docRoot}guide/topics/manifest/activity-element.html">{@code &lt;activity&gt;}</a> or <a
736href="{@docRoot}guide/topics/manifest/application-element.html">{@code &lt;application&gt;}</a>,
737only touch events within the current activity window are accepted. For example, by disabling split
738touch events across windows, the system bar cannot receive touch events at the same time as the
739activity. This does <em>not</em> affect whether views inside the activity can split touch
740events&mdash;by default, the activity can still split touch events across views.</p>
741
742<p>For more information about creating a theme, read <a
743href="{@docRoot}guide/topics/ui/themes.html">Applying Styles and Themes</a>.</p>
744</li>
745</ul>
746
747
748
749<h3>WebKit</h3>
750
751<ul>
752 <li>New {@link android.webkit.WebViewFragment} class to create a fragment composed of a
753{@link android.webkit.WebView}.</li>
754 <li>New {@link android.webkit.WebSettings} methods:
755 <ul>
756 <li>{@link
757android.webkit.WebSettings#setDisplayZoomControls setDisplayZoomControls()} allows you to hide
758the on-screen zoom controls while still allowing the user to zoom with finger gestures ({@link
759android.webkit.WebSettings#setBuiltInZoomControls setBuiltInZoomControls()} must be set
760{@code true}).</li>
761 <li>New {@link android.webkit.WebSettings} method, {@link
762android.webkit.WebSettings#setEnableSmoothTransition setEnableSmoothTransition()}, allows you
763to enable smooth transitions when panning and zooming. When enabled, WebView will choose a solution
764to maximize the performance (for example, the WebView's content may not update during the
765transition).</li>
766 </ul>
767 <li>New {@link android.webkit.WebView} methods:
768 <ul>
769 <li>{@link android.webkit.WebView#onPause onPause()} callback, to pause any processing
770associated with the WebView when it becomes hidden. This is useful to reduce unnecessary CPU or
771network traffic when the WebView is not in the foreground.</li>
772 <li>{@link android.webkit.WebView#onResume onResume()} callback, to resume processing
773associated with the WebView, which was paused during {@link android.webkit.WebView#onPause
774onPause()}.</li>
775 <li>{@link android.webkit.WebView#saveWebArchive saveWebArchive()} allows you to save the
776current view as a web archive on the device.</li>
777 <li>{@link android.webkit.WebView#showFindDialog showFindDialog()} initiates a text search in
778the current view.</li>
779 </ul>
780 </li>
781</ul>
782
783
784
785<h3>Browser</h3>
786
787<p>The Browser application adds the following features to support web applications:</p>
788
789<ul>
790 <li><b>Media capture</b>
791 <p>As defined by the <a href="http://dev.w3.org/2009/dap/camera/">HTML Media Capture</a>
792specification, the Browser allows web applications to access audio, image and video capture
793capabilities of the device. For example, the following HTML provides an input for the user to
794capture a photo to upload:</p>
795<pre>
796&lt;input type="file" accept="image/*;capture=camera" />
797</pre>
798<p>Or by excluding the {@code capture=camera} parameter, the user can choose to either capture a
799new image with the camera or select one from the device (such as from the Gallery application).</p>
800 </li>
801
802 <li><b>Device Orientation</b>
803 <p>As defined by the <a
804href="http://dev.w3.org/geo/api/spec-source-orientation.html">Device Orientation Event</a>
805specification, the Browser allows web applications to listen to DOM events that provide information
806about the physical orientation and motion of the device.</p>
807 <p>The device orientation is expressed with the x, y, and z axes, in degrees and motion is
808expressed with acceleration and rotation rate data. A web page can register for orientation
809events by calling {@code window.addEventListener} with event type {@code "deviceorientation"}
810and register for motion events by registering the {@code "devicemotion"} event type.</p>
811 </li>
812
813 <li><b>CSS 3D Transforms</b>
814 <p>As defined by the <a href="http://www.w3.org/TR/css3-3d-transforms/">CSS 3D Transform
815Module</a> specification, the Browser allows elements rendered by CSS to be transformed in three
816dimensions.</p>
817 </li>
818</ul>
819
820
821
822<h3>JSON utilities</h3>
823
824<p>New classes, {@link android.util.JsonReader} and {@link android.util.JsonWriter}, help you
825read and write JSON streams. The new APIs complement the {@link org.json} classes, which manipulate
826a document in memory.</p>
827
828<p>You can create an instance of {@link android.util.JsonReader} by calling
829its constructor method and passing the {@link java.io.InputStreamReader} that feeds the JSON string.
830Then begin reading an object by calling {@link android.util.JsonReader#beginObject()}, read a
831key name with {@link android.util.JsonReader#nextName()}, read the value using methods
832respective to the type, such as {@link android.util.JsonReader#nextString()} and {@link
833android.util.JsonReader#nextInt()}, and continue doing so while {@link
834android.util.JsonReader#hasNext()} is true.</p>
835
836<p>You can create an instance of {@link android.util.JsonWriter} by calling its constructor and
837passing the appropriate {@link java.io.OutputStreamWriter}. Then write the JSON data in a manner
838similar to the reader, using {@link android.util.JsonWriter#name name()} to add a property name
839and an appropriate {@link android.util.JsonWriter#value value()} method to add the respective
840value.</p>
841
842<p>These classes are strict by default. The {@link android.util.JsonReader#setLenient setLenient()}
843method in each class configures them to be more liberal in what they accept. This lenient
844parse mode is also compatible with the {@link org.json}'s default parser.</p>
845
846
847
848
849<h3>New feature constants</h3>
850
851<p>The <a
852href="{@docRoot}guide/topics/manifest/uses-feature-element.html">{@code &lt;uses-feature&gt;}</a>
853manfest element should be used to inform external entities (such as Google Play) of the set of
854hardware and software features on which your application depends. In this release, Android adds the
855following new constants that applications can declare with this element:</p>
856
857<ul>
858 <li>{@link android.content.pm.PackageManager#FEATURE_FAKETOUCH "android.hardware.faketouch"}
859 <p>When declared, this indicates that the application is compatible with a device that offers an
860emulated touchscreen (or better). A device that offers an emulated touchscreen provides a user input
861system that can emulate a subset of touchscreen
862capabilities. An example of such an input system is a mouse or remote control that drives an
863on-screen cursor. Such input systems support basic touch events like click down, click up, and drag.
864However, more complicated input types (such as gestures, flings, etc.) may be more difficult or
865impossible on faketouch devices (and multitouch gestures are definitely not possible).</p>
866 <p>If your application does <em>not</em> require complicated gestures and you do
867<em>not</em> want your application filtered from devices with an emulated touchscreen, you
868should declare {@link
869android.content.pm.PackageManager#FEATURE_FAKETOUCH "android.hardware.faketouch"} with a <a
870href="{@docRoot}guide/topics/manifest/uses-feature-element.html">{@code &lt;uses-feature&gt;}</a>
871element. This way, your application will be available to the greatest number of device types,
872including those that provide only an emulated touchscreen input.</p>
873 <p>All devices that include a touchscreen also support {@link
874android.content.pm.PackageManager#FEATURE_FAKETOUCH "android.hardware.faketouch"}, because
875touchscreen capabilities are a superset of faketouch capabilities. Thus, unless you actually require
876a touchscreen, you should add a <a
877href="{@docRoot}guide/topics/manifest/uses-feature-element.html">{@code &lt;uses-feature&gt;}</a>
878element for faketouch.</p>
879 </li>
880</ul>
881
882
883
884
885<h3>New permissions</h3>
886
887<ul>
888 <li>{@link android.Manifest.permission#BIND_REMOTEVIEWS
889"android.permission.BIND_REMOTEVIEWS"}
890 <p>This must be declared as a required permission in the <a
891href="{@docRoot}guide/topics/manifest/service-element.html">{@code &lt;service&gt;}</a> manifest
892element for an implementation of {@link android.widget.RemoteViewsService}. For example, when
893creating an App Widget that uses {@link android.widget.RemoteViewsService} to populate a
894collection view, the manifest entry may look like this:</p>
895<pre>
896&lt;service android:name=".widget.WidgetService"
897 android:exported="false"
898 android:permission="android.permission.BIND_REMOTEVIEWS" />
899</pre>
900</ul>
901
902
903
904<h3>New platform technologies</h3>
905
906<ul>
907<li><strong>Storage</strong>
908 <ul>
909 <li>ext4 file system support to enable onboard eMMC storage.</li>
910 <li>FUSE file system to support MTP devices.</li>
911 <li>USB host mode support to support keyboards and USB hubs.</li>
912 <li>Support for MTP/PTP </li>
913 </ul>
914</li>
915
916<li><strong>Linux Kernel</strong>
917 <ul>
918 <li>Upgraded to 2.6.36</li>
919 </ul>
920</li>
921
922<li><strong>Dalvik VM</strong>
923 <ul>
924 <li>New code to support and optimize for SMP</li>
925 <li>Various improvements to the JIT infrastructure</li>
926 <li>Garbage collector improvements:
927 <ul>
928 <li>Tuned for SMP</li>
929 <li>Support for larger heap sizes</li>
930 <li>Unified handling for bitmaps and byte buffers</li>
931 </ul>
932 </li>
933 </ul>
934</li>
935
936<li><strong>Dalvik Core Libraries</strong>
937 <ul>
938 <li>New, much faster implementation of NIO (modern I/O library)</li>
939 <li>Improved exception messages</li>
940 <li>Correctness and performance fixes throughout</li>
941 </ul>
942</li>
943</ul>
944
945
946
947<h3 id="api-diff">API differences report</h3>
948
949<p>For a detailed view of all API changes in Android {@sdkPlatformVersion} (API Level
950{@sdkPlatformApiLevel}), see the <a
951href="{@docRoot}sdk/api_diff/{@sdkPlatformApiLevel}/changes.html">API Differences Report</a>.</p>
952
953
954
955
956
957<h2 id="api-level">API Level</h2>
958
959<p>The Android {@sdkPlatformVersion} platform delivers an updated version of
960the framework API. The Android {@sdkPlatformVersion} API
961is assigned an integer identifier &mdash;
962<strong>{@sdkPlatformApiLevel}</strong> &mdash; that is
963stored in the system itself. This identifier, called the "API Level", allows the
964system to correctly determine whether an application is compatible with
965the system, prior to installing the application. </p>
966
967<p>To use APIs introduced in Android {@sdkPlatformVersion} in your application,
968you need compile the application against the Android library that is provided in
969the Android {@sdkPlatformVersion} SDK platform. Depending on your needs, you might
970also need to add an <code>android:minSdkVersion="{@sdkPlatformApiLevel}"</code>
971attribute to the <code>&lt;uses-sdk&gt;</code> element in the application's
972manifest. If your application is designed to run only on Android 2.3 and higher,
973declaring the attribute prevents the application from being installed on earlier
974versions of the platform.</p>
975
976<p>For more information, read <a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#ApiLevels">What is API
977Level?</a></p>