Android 3


Published on

What's new in Android 3.0 Honeycomb

  • Be the first to comment

  • Be the first to like this

No Downloads
Total views
On SlideShare
From Embeds
Number of Embeds
Embeds 0
No embeds

No notes for slide

Android 3

  1. 1. Robert CooperReach Health
  2. 2.  Tablet-specific version of Android  New UI Metaphors  New LaF (Holographic)  New/Improved APIs.  Old APIs made optional (telephony, etc)  New Technologies Basis for future releases  3.1 seems to be on-deck  Merged with phone branch?
  3. 3.  Hopefully everything, at least briefly. Detailed discussion of the things I just you are most likely to care about as a developer :P
  4. 4.  ActionBar  Used for “App Global” Tabs  Special MenuItems or SubMenus  App Icon with a “Logical Home” operation No Hard Buttons  NotificationBar now includes “Back”, “Home” and “Tasks” Long-Touch context menus deprecated as a model
  5. 5.  Holographic look and feel added Make it more TRON-ish… … but not too TRON-ish Lots of glows, varied depth line markers, 3D transitions Improved text ops mechanics
  6. 6.  Fragments  Sub-Activities Loaders  Async-Friendly Content Fetchers ActionBar  New Menuing and Nav System. Enhanced Interaction for Widgets and Notifications Drag and Drop
  7. 7.  Fragments  Fragments are Sub-Activities that can be recomposed based on UI factors (screen size, orientation, etc)  Part of 3.0, but available as a build-in backport as far back as 1.6 with the “Android Compatibility Package” (Available in the SDK/AVD Manager)
  8. 8.  Fragments mimic Activity lifecycle:  onCreate()  onStart()  onCreateView()*  onPause()  onStop()
  9. 9.  Fragments laid out as part of Layouts<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent"> <fragment android:name="" android:id="@+id/list" android:layout_weight="1" android:layout_width="0dp" android:layout_height="match_parent" /> <fragment android:name="" android:id="@+id/viewer" android:layout_weight="2" android:layout_width="0dp" android:layout_height="match_parent" /> </LinearLayout>
  10. 10.  Each Fragment becomes unique in the application Can move between Activities with different combinations of Fragments by passing Fragment model/URI information using the FragmentManager API. FragmentTransaction can be used to manipulate fragment state and “back” behavior
  11. 11.  FragmentTransaction Fragment newFragment = new ExampleFragment(); FragmentTransaction transaction = getFragmentManager().beginTransaction(); transaction.replace(, newFragmen t); transaction.addToBackStack(null); transaction.commit();
  12. 12.  Loaders provide a standard way to load data for Fragments AsyncTaskLoader provides API for loading data asynchronously CursorLoader loads a paged dataset asynchronously – this is likely what you want to read, for example, an Atom Pub Proto data source remotely.
  13. 13.  Moving MenuItems to the ActionBar<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="" > <item android:id="@+id/menu_add" android:icon="@drawable/ic_menu_save" android:title="@string/menu_save" android:showAsAction="ifRoom|withText" /> </menu>
  14. 14.  Custom Views in ActionBar<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android=" id"> <item android:id="@+id/menu_search" android:title="Search" android:icon="@drawable/ic_menu_search" android:showAsAction="ifRoom" android:actionLayout="@layout/searchview" android:actionViewClass="android.widget.SearchView" /> </menu>
  15. 15.  Custom Views in ActionBar (cont)SearchView searchView = (SearchView) menu.findItem( ();
  16. 16.  Navigation  Big win over iOS! Implicit “Home” widget (vs iOS Nav Bar) App Global Tabs (vs iOS Tool Bar) App List Navigation
  17. 17.  Getting the “Home” icon viewView home = a.findViewById(;home.setOnClickListener(new OnClickListener() { public void onClick(View arg0) { a.finish(); }}); Adding “Up” markerActionBar actionBar = this.getActionBar();actionBar.setDisplayHomeAsUpEnabled(true);
  18. 18.  ActionBar Tabs final ActionBar actionBar = getActionBar(); actionBar.setNavigationMode( ActionBar.NAVIGATION_MODE_TABS); // remove the activity title to make space for tabs actionBar.setDisplayShowTitleEnabled(false); Fragment artistsFragment = new ArtistsFragment(); actionBar.addTab(actionBar.newTab() .setText(R.string.tab_artists) .setTabListener(new TabListener(artistsFragment))); Fragment albumsFragment = new AlbumsFragment(); actionBar.addTab(actionBar.newTab() .setText(R.string.tab_albums) .setTabListener(new TabListener(albumsFragment)));
  19. 19.  ActionBar List (Spinner) Navigation ActionBar actionBar = getActionBar(); actionBar.setNavigationMode( ActionBar.NAVIGATION_MODE_LIST); actionBar.setListNavigationCallbacks( new SpinnerAdapter(){ public View getDropDownView(int position, View convertView, View Group parent){ // … } }, new OnNavigationListener(){ public boolean onNavigationItemSelected( int itemPosition, long itemId){ //… } });
  20. 20.  Notifications can now use RemoteViews to allow interaction with the popup notification, rather than just launch an intent. RemoteViews layout = new RemoteViews( getPackageName(), R.layout.notification); notification.contentView = layout; layout.setOnClickPendingIntent(, getDialogPendingIntent( "You pressed it!"));
  21. 21. PendingIntent getDialogPendingIntent( String dialogText) { return PendingIntent.getActivity( this, // send back to the creating Act. dialogText.hashCode(), new Intent(ACTION_DIALOG) .putExtra(Intent.EXTRA_TEXT, dialogText) .addFlags( Intent.FLAG_ACTIVITY_NEW_TASK), 0); }
  22. 22. Handling the PendingIntent: if (ACTION_DIALOG.equals(intent.getAction())) { showDialog( intent.getStringExtra( Intent.EXTRA_TEXT)) }PendingIntent then becomes an invisible call back into your Activity.
  23. 23.  Any View can now be dragged about the screen. To begin a drag action call: myView.startDrag( dragData, dragShadowBuilder, localData, 0 /*unused int flags */); Can be called from you OnClick/OnLongClick listeners… localData is just any Object that will be sent with each DragEvent.
  24. 24.  dragData: is a ClipData object. This contains the data representation of what is being dragged: ClipData.Item item = new ClipData.Item(v.getTag()); ClipData dragData = new ClipData(v.getTag(), ClipData.MIMETYPE_TEXT_PLAIN,item);Be sure to use the “tag” property for your model data!
  25. 25.  Create the DrawShadowBuilder. This returns the view that is dragged about under the pointer. This class takes a View as an argument and looks a lot like the stock View paint lifecycle. @Override public void onProvideShadowMetrics (Point size, Point touch) @Override public void onDrawShadow(Canvas canvas) The first method sets the bounds, the second paints to the canvas. You can use the View’s existing draw() method then mutate it
  26. 26.  DragEvents  onDragEvent(DragEvent) or View.OnDragListener on any view (These are really for Drop Targets) DragEvent.getAction() returns one of the possible event action types.
  27. 27.  ACTION_DRAG_STARTED  Sent to all active Views – check here for drop target validity! ACTION_DRAG_ENTERED  Sent when the touch enters the box of the View ACTION_DRAG_LOCATION  Sent on each move while in the box of the View ACTION_DRAG_EXITED  Sent when the touch leaves the box. ACTION_DROP  Sent on drop event *ONLY* when the View/Listener returned “true” from the ACTION_DRAG_STARTED event.
  28. 28.  Support for Hardware Accelerated Graphics  Applies to stock animations and drawing APIs  Comes damned near for free but…  … if you haven’t tested it, it doesn’t work.  Romain Guy eats his words! :P Property animation RenderScript  A C99-ish script for doing OpenGL ops  Should be like falling off a log for people with OpenCL experience (read: not me)
  29. 29.  Activation/Deactivation  Step 1: Add… android:hardwareAccelerated="true|false“ …to your <application> or <activity>  Step 2: Profit!
  30. 30.  Looks a whole lot like every other reflective animator (Swing-X, Gwittir, Moo Tools, etc) Lots of possible options, but easily summarized: ObjectAnimator anim = ObjectAnimator.ofFloat( someObject, “someProperty", startValue, endValue); anim.setInterpolater( someInterpolater ); anim.setDuration(1000); anim.start();
  31. 31.  Lots of stock interpolators (mutation strategies)  AccelerateDecelerateInterpolator : Sinoidal  AccelerateInterpolator : Geometric  AnticipateInterpolator : Start backwards, then fling forward  BounceInterpolator : Bounces around the end value  Linear Interpolator : Even steps  “And many, many more!”
  32. 32.  Not even going to get into this. Example from Google: #pragma version(1) #pragma rs java_package_name( rs_allocation gIn; rs_allocation gOut; rs_script gScript; const static float3 gMonoMult = {0.299f, 0.587f, 0.114f}; void root(const uchar4 *v_in, uchar4 *v_out, const void *usrData, uint32_t x, uint32_t y) { float4 f4 = rsUnpackColor8888(*v_in); float3 mono = dot(f4.rgb, gMonoMult); *v_out = rsPackColorTo8888(mono); } void filter() { rsForEach(gScript, gIn, gOut, 0); }
  33. 33.  DownloadManager API is VASTLY improved over the Gingerbread version!  It is actually usable now! HTTP Live Streaming support Improved SIP API over Gingerbread. Accessibility improvements
  34. 34.  Still questions about what API 12 will mean  ActionBar/New Notifications on Phones? Is that a good idea?  Keeping phones with the current menu strategy?  How to detect “Tablet-y” systems? Google TV? Lots and Lots of “Reflectively constructed strategies” – I it is manageable, but getting harder to support older devices