what's new in android

Post on 19-May-2015

1.792 Views

Category:

Technology

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

A quick catchup for Android developers who have fallen behind the curve.

TRANSCRIPT

What’s New in AndroidGetting up to speed with HC/ICS

Robert CooperReach Health@kebernet / +Robert Cooper

Why are you here?

You never upgraded your app for Honeycomb

You think cloning your iOS app to Android is a keen idea

You are completely new to Android(most of this will pass you buy, but try and osmotically absorb some of it)

Android is neat

Your boss said you need to be on this track

Who is this guy?

I wrote this... (not related)

I work here…

I also do this stuff…

So what is new?

New UI metaphors ActionBar Onscreen, adaptive menus

Spec Hardware changes No hard buttons

New look and feel Mandatory for ICS across OEMs to render unmodified

So what is new?

What does Logical Up Mean?

It means back to the list for alternate or sub views.

New LaF

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

New APIs

Fragments Sub-Activities

ActionBar New Menuing and Nav System.

Enhanced Interaction for Widgets and Notifications

Drag and Drop

P2P Networking NFC (Android Beam) WiFi Direct

Fragments

Fragments are Sub-Activities that can be recomposed based on UI factors (screen size, orientation, etc)

Introduced with 3.0 tablets now global in 4.0

Available as a build-in backport as far back as 1.6 with the “Android Compatibility Package” (Available in the SDK/AVD Manager)

Mimics Activity Lifecycle

onCreate()

onStart()

onCreateView() (this is new!)

onPause()

onStop()

Fragments are Layout parts

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="horizontal"    android:layout_width="match_parent"    android:layout_height="match_parent">    <fragment android:name="com.example.news.ArticleListFragment"            android:id="@+id/list"            android:layout_weight="1"            android:layout_width="0dp"            android:layout_height="match_parent" />    <fragment android:name="com.example.news.ArticleReaderFragment"            android:id="@+id/viewer"            android:layout_weight="2"            android:layout_width="0dp"            android:layout_height="match_parent" /></LinearLayout>

Fragments are Sub-Activities that can be 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

FragmentTransaction manipulates the back state

Fragment newFragment = new ExampleFragment();FragmentTransaction transaction = getFragmentManager().beginTransaction();

transaction.replace(R.id.fragment_container, newFragment);transaction.addToBackStack(null);

transaction.commit();

ActionBar(Know it. Love it.)

What is it?

New nav metaphor Home Logical “UP” Activity global tabs

New menuing system Toolbar Overflow menuing

How to Use It

NOT part of the compatibility package Check out ActionBarSherlock.com for a backport

You MUST request the Holographic theme android:theme="@android:style/Theme.Holo” android:theme="@android:style/Theme.Holo.Light” setTheme(android.R.style.Theme_Holo); setTheme(android.R.style.Theme_Holo_Light);

Menus on the ActionBar

<?xml version="1.0" encoding="utf-8"?><menu xmlns:android="http://schemas.android.com/apk/res/android">    <item android:id="@+id/menu_add"          android:icon="@drawable/ic_menu_save"          android:title="@string/menu_save"          android:showAsAction="ifRoom|withText" /></menu>

Custom Views in the ActionBar

<?xml version="1.0" encoding="utf-8"?><menu xmlns:android="http://schemas.android.com/apk/res/android">    <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>

SearchView searchView =

(SearchView) menu.findItem(R.id.menu_search) .getActionView();

Getting the “Home” icon view

View home = a.findViewById(android.R.id.home);

home.setOnClickListener(new OnClickListener() {

public void onClick(View arg0) {

a.finish();

}

});

Adding “Up” marker

ActionBar actionBar = this.getActionBar(); //or SherlockActivity.getSupportActionBar();

actionBar.setDisplayHomeAsUpEnabled(true);

ActionBar Tabs final ActionBar actionBar = getActionBar();

actionBar.setNavigationMode( ActionBar.NAVIGATION_MODE_TABS);

// remove the activity title to make space for tabsactionBar.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)));

Spinner/List/Drop down Nav 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){ //… } });

Notifications(They do stuff

now)

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( R.id.my_button, getDialogPendingIntent( "You pressed it!"));

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

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.

Drag and Drop

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.

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.@Overridepublic void onProvideShadowMetrics(Point size, Point touch)@Overridepublic 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 (read: opacity)

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.

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.

Android Beam

You App has Data

People like to share data

People like to move data between devices

The Cloud is Magic™

NFC is complex. Android Beam is Simple

Sending a Beam

Call NfcAdapter.getDefaultAdapther(ctx)

Check for null.

Call .setNdefPushMessage() with your Activity and your data

Profit!

final byte[] langBytes = locale.getLanguage().getBytes(Charsets.US_ASCII);

final Charset utfEncoding = encodeInUtf8 ? Charsets.UTF_8 : Charset.forName("UTF-16");

final byte[] textBytes =text.getBytes(utfEncoding);

final int utfBit = encodeInUtf8 ? 0 : (1 << 7);

final char status = (char) (utfBit + langBytes.length);

final byte[] data = Bytes.concat(new byte[] {(byte) status}, langBytes, textBytes);

new NdefRecord(NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_TEXT, new byte[0], data);

RTD_URI is a lot easier!

final byte[] typeBytes = "image/jpeg” .getBytes(Charsets.US_ASCII);

final byte[] data = getData();

new NdefRecord(NdefRecord.TNF_MIME_MEDIA, typeBytes, new byte[0], data);

Getting a Beam

Call NfcAdapter. setNdefPushMessageCallback() with your activity(ies)

OR

Handle ACTION_NDEF_DISCOVERED in your Manifest for URLs or Mime Types

Profit!

Too easy NOT to do.

WiFi Direct(or JINI with

Sockets)

WiFi Direct

Based on the idea of Channels, Groups, and Peers Channels – managed by the OS, like a WiFi Channel

ID Groups – Ad host client-server networks. One device

is the master, and other machines can connect to it Peers – Devices attached to the Group

You can monitor peer presence within your channel

Once you identify peers, you can use “Plain Old Sockets” to talk to them

public class WiFiDirectBroadcastReceiver extends BroadcastReceiver { private WifiP2pManager manager; private Channel channel; private MyWiFiActivity activity;

public WiFiDirectBroadcastReceiver(WifiP2pManager manager, Channel channel, ApplicationActivity activity) { super();

this.manager = manager; this.channel = channel; this.activity = activity; }

@Override public void onReceive(Context context, Intent intent) { String action = intent.getAction();

if (WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION.equals(action)) { } else if (WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action)) { } else if

(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION.equals(action)) { } else if (WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION.equals(action)) { } }}

manager = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE);

channel = manager.initialize(this, getMainLooper(), null); receiver = new WiFiDirectBroadcastReceiver(manager,

channel, this);

// ...

@Override protected void onResume() { super.onResume(); registerReceiver(receiver, intentFilter); manager.createGroup(channel, new ActionListener(){ //...

} } @Override protected void onPause() { super.onPause(); unregisterReceiver(receiver); }

Talking to Others

Request a list of peers

Select a Device from the list of peers

Connect to the Device – this is Data Link connect, not Application connect

Open your sockets

Once connected

manager.discoverPeers(channel, new WifiP2pManager.ActionListener() { @Override public void onSuccess() {

manager.requestPeers( new PeerListListener(){ public void onPeersAvailable(WiFiP2pDeviceList devices){ // do stuff here } } }

@Override public void onFailure(int reasonCode) { }});

//…

WifiP2pConfig config = new WifiP2pConfig();config.deviceAddress = device.deviceAddress;manager.connect(channel, config, new ActionListener() {

@Override public void onSuccess() { }

@Override public void onFailure(int reason) { }});

WifiP2pConfig config = new WifiP2pConfig();config.deviceAddress = device.deviceAddress;manager.connect(channel, config, new ActionListener() {

@Override public void onSuccess() { }

@Override public void onFailure(int reason) { }});

// from ConnectionInfoListener…

@Override public void onConnectionInfoAvailable(

WifiP2pInfo info) { info.groupOwnerAddress.getHostAddress();

What to Remember

Make your app Androidish(but not too Androidish)

Use Fragments to recompose your app for various form factors

Android Beam support is brain free. Your app *should* support it.

WiFi direct can take the pain out of true on-the-go P2P networking. (Save your users WAN transfers)

Thanks!

Robert CooperReach Health@kebernet / +Robert Cooper

top related