Desarrollo en Android PDF

Desarrollo en Android (v1.

0)
Roberto Calvo Palomino (rocapal@libresoft.es) GSyC/LibreSoft June 17, 2009

1

Una copia de este documento y sus fuentes para poder compilarlo se puede encontrar en la siguiente url:

http://libresoft.es/Members/rocapal/docs/androiddevel

(c) 2009 Roberto Calvo Palomino Esta obra est´ bajo una licencia Reconocimiento-Compartir a bajo la misma licencia 3.0 Espa˜a de Creative Commons. n Para ver una copia de esta licencia, visite http://creativecommons.org/licenses/by-sa/3.0/es/ o envie una carta a Creative Commons, 171 Second Street, Suite 300, San Francisco, California 94105, USA.

. . . . . . . . . . . .2 Men´s Contextuales . . . . . . . . . . 21 u 7 Resumen 23 3 . . . . . . . . . . . . . . . . . . . 20 u 6. . . . . . . . . . . . . . . . . .3 Desarrollo 4 4 4 5 Android 6 de una ’Activity’ . . . . . . .Contents 1 Introducci´n o 2 Qu´ es y qu´ no es este documento e e 3 Fundamentos de una aplicaci´n Android o 4 Ciclo de vida de una aplicaci´n Android o 5 Desarrollo en 5. . . . . . . . . . . . . . . . . . . . . . . . . . 12 de una ’ActivityList’ . . . .1 Men´s . . . . . . 15 6 Men´ s y men´ s contextuales u u 20 6. 6 de una ’ActivityMap’ . . . . . . . . . . . . . . . . . . . . . . . . . . .2 Desarrollo 5. . . . . . . . . . .1 Desarrollo 5. . . . . .

activityMap. potente y fiable para o programar en sistemas m´viles. o o ˆ te describir´ los distintos procesos existentes en Android.) n a ˆ es un documento explicativo sobre la filosof´ de Android.org/wiki/Open Handset Alliance 4 . o Lecturas recomendadas sobre esta secci´n: o ˆ What is Android? http://developer.android. ıa ˆ es un documento avanzado sobre programaci´n en JAVA/Android. o 3 Fundamentos de una aplicaci´n Android o La plataforma de Android proporciona diferentes componentes a la hora de programar en funci´n del objetivo de tu aplicaci´n. n a o Este documento NO: ˆ te ense˜ar´ a instalar el entorno (sdk.com/guide/basics/what-is-android.html 2 Qu´ es y qu´ no es este documento e e Este documento SI: ˆ es una introducci´n a la programaci´n en Android. activityList y services. Android provee cuatro tipos diferentes de o o componentes: 1 http://en. Todo naci´ all´ por el 2007 cuando se estableci´ la OHA (Open o o a o Handset Alliance) 1 que se conforma por m´s de 40 empresas relacionadas con la a fabricaci´n (hardware y software) y distribuci´n de dispositivos m´viles. numerosos programadores han encontrado en este sistema operativo la primera plataforma de programaci´n sencilla. a o ˆ te ense˜ar´ a utilizar mapas. eclipse ... a ˆ te ayudar´ a realizar tu primera aplicaci´n Android. gps y servicios en tu aplicaci´n Android. En este documento vamos a realizar una introducci´n o o a la programaci´n en la plataforma Android cuyo fin ser´ que podamos construir una o a aplicaci´n sencilla basada en activity.wikipedia. o o o Desde su lanzamiento.1 Introducci´n o Android es el sistema operativo de Google especialmente dise˜o para ejecutar en n dispositivos m´viles.

a a o Una caracter´ ıstica peculiar en Android es que el tiempo de vida de un proceso no es controlado directamente por la aplicaci´n.ˆ Activity: Una actividad es el componente m´s usado en las aplicaciones Android. La navegaci´n entre las pantallas se realiza iniciando nuevas o actividades. Es el sistema quien decide y determina el o tiempo de vida bas´ndose en el uso y capacidades del sistema.. ıa ˆ Intent: Este tipo de componentes es una clase especial que usa Android para moverse de una pantalla a otra..android. Todos los receivers heredan de la clase base BroadcastReceiver. pero puede ejecutarse en a “background” por un tiempo indefinido (se asemeja mucho al demonio de los sistemas Linux). una aplicaci´n Android ejecuta dentro de su propio proceso ıa o Linux. llamadas. Android prioriza los procesos bajo una jerarqu´ para asignar a cada proceso ıa una importancia en el sistema. a Para determinar que procesos deber´ ser eliminados ante una condici´n baja de ıan o memoria. El proceso es creado para ejecutar el c´digo de la aplicaci´n y es el sistema quien o o pedir´ y reclamar´ su memoria para reasignarla a otra aplicaci´n. a T´ ıpicamente una actividad representa una pantalla individual en el terminal y presenta una interfaz gr´fica al usuario. Mientras tanto el usuario puede seguir realizando otras tareas. en una aplicaci´n de a o listado de tel´fonos utilizar´ e ıamos dos actividades. Cualquiera activity puede reutilizar funcionalidades de otros componentes con solo hacer una solicitud en la forma de Intent. u ˆ Broadcast receivers: Este tipo de componentes se utilizan para recibir y reaccionar ante ciertas notificaciones broadcast. Un Intent describe lo que una aplicaci´n desea o hacer. Una para mostrar el listado de nombres y tel´fonos y la segunda. Por ejemplo.com/guide/topics/fundamentals. Existen diferentes procesos de acuerdo a esta jerarqu´ ıa: 5 . la actividad previa es puesta en pausa y agregada el “history stack” y no volver´ al estado de ejecuci´n hasta que a o vuelva a ser invocada. Este tipo de componentes no tienen interfaz gr´fica y pueden reaccionar ante eventos como cambio de zona horarias. podemos utilizar un servicio para que vaya capturando cada cierto tiempo la posici´n GPS y nos avise cuando estemos cerca o de alg´n amigo. Cuando una actividad es abierta. para mostrar la informaci´n detallada del e o contacto seleccionado. ˆ Services: Un servicio no tiene interfaz gr´fica.html 4 Ciclo de vida de una aplicaci´n Android o En la mayor´ de los casos. a nivel de bater´ . Por ejemplo. Lecturas recomendadas: ˆ Application Fundamentals http://developer.

<!-. Normalmente la e eliminaci´n de estos procesos no suponen un gran impacto para la actividad del o usuario. que unicamente tenga un par de componentes y una finalidad clara. Es muy usual que existan numerosos procesos de este tipo en el sistema. 5 Desarrollo en Android Una vez que hemos explicado los diferentes procesos y sus ciclos de vida dentro del sistema operativo Android. vamos a pasar a detallar la implementaci´n de alguno de o estos procesos. 5. Esto ocurre en situaciones donde la e aplicaci´n muestra una cuadro de dialogo para interactuar con el usuario. o o u ˆ Background Process: Es un proceso que aloja una activity que no es actualmente visible para el usuario (su m´todo onStop() ha sido llamado).Activity permission --> <activity android:name="LocationActivity"></activity> 6 . Es com´n. La raz´n de existir u o de este proceso es tener una cache disponible de la aplicaci´n para su pr´xima o o activaci´n. Vamos a ´ crear una actividad que contenga un bot´n y una etiqueta (textview) para mostrar la o posici´n GPS actual. o En un proyecto nuevo o existente es necesario crear la actividad LocationActivity. reproducci´n de m´sica).ˆ Foreground Process: Es un proceso de primer plano que aloja una activity en la pantalla y con la que el usuario est´ interactuando (su m´todo onResume() ha sido a e llamado) ´ que un IntentReceiver est´ ejecut´ndose. ´ ˆ Empty Process: Es un proceso que no aloja ning´n componente. por lo que el sistema mantiene una lista para asegurar que el ultimo proceso visto ´ por el usuario sea el ultimo en eliminarse en caso de necesitar memoria. ˆ Service Process: Es un proceso que aloja un service que ha sido iniciado con el m´todo startService(). que el sistema elimine este tipo de procesos con frecuencia o u para obtener memoria disponible.xml a para ejecutar la actividad y para tener acceso al GPS. a o simple. Este tipo de procesos ser´n o a a a eliminados como ultimo recurso si el sistema necesitase memoria. Adem´s no hay que olvidarse de dar los permisos oportunos en el archivo Manifest. Este tipo o de procesos no ser´ eliminado a caso que sea necesaria la memoria para mantener a a todos los procesos del primer plano corriendo. Este tipo de procesos no son visibles y suelen ser e importantes para el usuario (conexi´n con servidores. ´ ˆ Visible Process: Es un proceso que aloja una activity pero no est´ en primera a plano (su m´todo onPause() ha sido llamado).1 Desarrollo de una ’Activity’ El primer ejemplo pr´ctico que vamos a ver es la creaci´n de una actividad sencilla.

xml) de la interfaz y los permisos correspondientes.android.<!-.permission. o <?xml version="1.0" encoding="utf-8"?> <AbsoluteLayout android:id="@+id/widget0" android:layout_width="fill_parent" android:layout_height="fill_parent" xmlns:android="http://schemas.ACCESS_FINE_LOCATION"> </uses-permission> Ahora lo que crearemos es el layout (escrito en xml) que representa la interfaz gr´fica a que tendr´ nuestra actividad.com/apk/res/android" > <Button android:id="@+id/btUpdate" android:layout_width="137px" android:layout_height="43px" android:text="Update GPS" android:layout_x="90px" android:layout_y="44px" > </Button> <TextView android:id="@+id/tvGPS" android:layout_width="202px" android:layout_height="44px" android:textSize="16sp" android:layout_x="52px" android:layout_y="119px" > </TextView> </AbsoluteLayout> Ahora que ya tenemos el layout (que llamaremos main.GPS permission --> <uses-permission android:name="android. vamos a pasar a la descripci´n del c´digo de la clase. o o 7 . Ser´ una interfaz sencilla donde tendremos un bot´n y un a a o textview para mostrar nuestra localizaci´n.

txtLocation = (TextView) this. private LocationManager mLocationManager. Es importante comentar que al bot´n le establecemos un listener para el evento onClick. o a o ´ Unicamente tenemos dos.layout. TextView txtLocation. private MyLocationListener mLocationListener.id. OnClickListener Nuestra clase LocationActivity hereda de la clase Activity.setOnClickListener(this). { private private private private ProgressDialog pd.findViewById(R.id.public class LocationActivity extends Activity implements Runnable. que ejecutar´ el m´todo o a e updateSignalGPS que se detallar´ en las siguientes l´ a ıneas. setContentView(R. btUpdate = (Button)this.btUpdate). } public void onClick(View arg0) { updateSignalGPS(). 8 .tvGPS). por ello e realizamos la conexi´n de los widgets gr´ficos con la definici´n del archivo xml.onCreate(savedInstanceState). private Location mLocation. protected void onCreate(Bundle savedInstanceState) { super. Button btUpdate.findViewById(R. } El m´todo onCreate se encarga de iniciar la actividad por primera vez. Location currentLocation. y adem´s implementa a las interfaces OnClickListener (para poder capturar los eventos onClick del bot´n) y o Runnable (ya que vamos a ejecutar en un thread aparte la obtenci´n de la posici´n o o GPS).main). un Button y un TextView. btUpdate.

if (mLocationManager.isProviderEnabled(LocationManager. y adem´s ejecuta el thread o a cuyo c´digo mostramos a continuaci´n: o o public void run() { mLocationManager = (LocationManager)getSystemService(Context.prepare(). } Como vemos. mLocationManager. Looper.loop(). mLocationListener = new MyLocationListener(). 9 . pd = ProgressDialog..LOCATION_SERVICE).. 0. "Searching GPS Signal". true.show(this.OnCancelListener dialogCancel = new DialogInterface. el m´todo writeSignalGPS instancia un ’processDialog’ para que se e muestre en pantalla mientras se encuentra la posici´n GPS.OnCancelListener() { public void onCancel(DialogInterface dialog) { } }.private void writeSignalGPS() { DialogInterface. "Searching. true. Thread thread = new Thread(this).start().GPS_PROVIDER)) { Looper.". mLocationListener). thread. 0. dialogCancel).requestLocationUpdates( LocationType.

show(). "Signal GPS not found". Bundle extras) { // TODO Auto-generated method stub } } Es necesario implementar un LocationListener para ejecutar nuestro c´digo cuando o el sistema encuentra la posici´n GPS. Cuando el m´todo onLocationChanged se llame.quit(). Toast.myLooper(). } } En el c´digo anterior del thread podemos ver como se configura el provider de GPS o como fuente de localizaci´n. o e nos indicar´ que la posici´n GPS ha cambiado y por tanto podemos escribir dicha a o 10 . int status.makeText(getBaseContext(). } } public void onProviderDisabled(String provider) { // TODO Auto-generated method stub } public void onProviderEnabled(String provider) { // TODO Auto-generated method stub } public void onStatusChanged(String provider.sendEmptyMessage(0).LENGTH_LONG). o private class MyLocationListener implements LocationListener { public void onLocationChanged(Location loc) { if (loc != null) { handler.Looper. } else { Toast.

podemos ver como el manejador que hemos implementado es llamado ´ cuando se encuentra la posici´n GPS y por tanto desde aqu´ si podemos actualizar la o ı interfaz gr´fica. por lo que mostramos la informaci´n en el textview txtLocation a o Figure 1: Pantalla de la Activity 11 . if (currentLocation!=null) { txtLocation.toString() ). mLocationManager. Como nos encontramos ejecutando un thread.informaci´n en nuestra actividad.removeUpdates(mLocationListener). Por ultimo. } } }. no o podemos acceder a la interfaz gr´fica para modificar el textview (es una caracter´ a ıstica t´ ıpica de los sistemas gr´ficos).dismiss().setText("Current Position: " + currentLocation. Por ello vamos a utilizar el mecanismo de paso de a mensajes que Android implementa como Handlers. private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { pd.

. necesitamos un apiKey para poder utilizar los mapas de google desde Android. Para generar la clave seguir los siguientes pasos: $ keytool -list -keystore ~/.5. Por ultimo s´lo nos queda a˜adir en el archivo Manifest.android/debug.google. vamos a ver el c´digo necesario a o para mostrar nuestra localizaci´n en dicho mapa.android.android.MapView" android:id="@+id/myMapView" android:layout_width="320px" android:layout_height="220px" android:layout_x="0px" android:layout_y="180px" android:apiKey="" /> Como vemos. OnClickListener A˜adiremos en el layout el widget del mapa: n { <view class="com. Certificate fingerprint (MD5): 94:1E:43:49:87:73:BB:E6:A6:88:D7:20:F1:8E:B5:98 Despu´s deber´s ir a la siguiente url e a http://code.google.html y obtener tu clave a partir del MD5 que se ha generado anteriormente.keystore .2 Desarrollo de una ’ActivityMap’ Una vez que sabemos desarrollar sin problemas una activity.google.maps.xml la siguiente declaraci´n: ´ o n o <uses-library android:name="com. Cuando obtengas tu clave guardala en un sitio seguro y a˜´dela al layout. o private void showMap() { 12 .com/intl/es-ES/android/maps-api-signup. Lo primero que tenemos que hacer es heredar de la actividad MapActivity public class LocationActivity extends MapActivity implements Runnable.maps" /> Una vez que hemos configurado el layout para que aparezca el mapa y hemos creado la clave que nos permitir´ descargar mapas de google. vamos a ver como incluir un mapa (google maps) en dicha actividad. concretamente en la etiqueta na android:apiKey..

animateTo(geoPoint).setClickable(true). mapControl. private Location myLocation public void setLocation (Location loc) { myLocation = loc.if (mapView == null) mapView = (MapView) findViewById(R.setLocation(currentLocation). geoPoint = new GeoPoint( (int) (currentLocation. Despu´s calcularemos las coordenadas en el mapa e gracias a la localizaci´n actual que se ha obtenido a trav´s del GPS. if (myposOverlay == null) myposOverlay = new PositionOverlay(). 13 .getLongitude() * 1000000)).xml. myposOverlay. MapController mapControl = mapView.myMapView).add( myposOverlay ).id. o public class PositionOverlay extends Overlay { private final int mRadius = 5.getController(). mapControl. overlays.getOverlays(). (int) (currentLocation. Y por ultimo o e ´ a˜adiremos un Overlay o capa al mapa para mostrar nuestro nombre al lado de la n posici´n.removeAllViews(). overlays. } Como vemos en el anterior c´digo. mapView. conectaremos el widget mapView a la definici´n de o o mapview del archivo Manifest.setZoom(20).clear(). final List<Overlay> overlays = mapView.getLatitude() * 1000000). else mapView.

point.getLatitude() * 1000000).} @Override public void draw(Canvas canvas.x .x + 60.0).setFakeBoldText(true). paint. point.y. RectF oval = new RectF (point.setARGB(175.getLongitude() * 1000000)).y + mRadius).mRadius. 5. Paint paint = new Paint(). backPaint. point). point.0. String text = "My Name".0. paint). canvas. point.setAntiAlias(true). } Por ultimo. canvas.y + mRadius). (int) (myLocation. RectF backRect = new RectF ( point.y .drawRoundRect(backRect.toPixels(geoPoint. point.getProjection(). 5.x + mRadius.drawText (text. canvas.paint). s´lo nos quedar´ a˜adir el c´digo correspondiente para que cuando se ´ o a n o encuentre la se˜al de GPS.drawOval(oval. point.0). Paint backPaint = new Paint(). backPaint).3*mRadius.setARGB(250. Projection projection = mapView. Point point= new Point(). se llame al m´todo showMap que es el encargado de mostrar n e 14 . projection. boolean shadow) { GeoPoint geoPoint = new GeoPoint( (int) (myLocation.setAntiAlias(true).0. paint.mRadius.x + 2*mRadius. backPaint.255.x + 2 + mRadius.y . paint. MapView mapView. point. point.

vamos a dise˜ar el layout.nuestra posici´n en el mapa. o n 15 . showMap().] } Figure 2: Pantalla de la ActivityMap 5.. } [.. Por tanto lo primero.3 Desarrollo de una ’ActivityList’ Despu´s de ver como creamos una Activity o una ActivityMap vamos a ver como crear e una ActivityList que nos ayudar´ dise˜ar listas f´cilmente.setText("Current Position: " + currentLocation.toString() ).] if (currentLocation!=null) { txtLocation. En nuestro ejemplo. vamos a mostrar una lista o con informaci´n de nuestros amigos.. o private Handler handler = new Handler() { [. a n a La idea principal de una ActivityList es la creaci´n de un layout que nos permite o representar una lista con informaci´n. // This method show our position in the map..

0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.com/apk/res/android" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center_vertical" android:paddingTop="3dip" android:paddingBottom="3dip" > <ImageView android:id="@+id/image" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <LinearLayout android:layout_width="0dip" android:layout_weight="1" android:layout_marginLeft="6dip" android:layout_marginRight="6dip" android:layout_height="wrap_content" android:orientation="vertical" > <TextView android:id="@+id/name" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textSize="18dip" android:maxLines="2" android:textColor="?android:attr/textColorPrimary" /> <TextView android:id="@+id/info" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textSize="16dip" android:maxLines="3" 16 .<?xml version="1.android.

public String info. public void onCreate(Bundle savedInstanceState) { super. solo generamos el layout para el tipo de file que tendr´ la lista.onCreate(savedInstanceState). y la segunda se compone de dos TextView donde mostraremos el nombre e informaci´n de nuestros o amigos. public class FriendList extends ListActivity { public class Friend { public Bitmap image. mList = getFriendList(). public String name. setListAdapter(mAdapter). // Adapter for ListView mAdapter = new FriendsAdapter(this). } FriendsAdapter mAdapter. // This method must be return the information of friends. Dicha a fila contiene dos columnas (dos LinearLayout): la primera es una imagen.android:textColor="?android:attr/textColorPrimary" /> </LinearLayout> </LinearLayout> Como vemos. static private ArrayList<Friend> mList. } public static class FriendsAdapter extends BaseAdapter { 17 .

private Context mContext. // TODO Auto-generated method stub View view.LAYOUT_INFLATER_SERVICE).get(position).id. View convertView. view = inflater.layout.getSystemService(Context. } public int getCount() { // TODO Auto-generated method stub return mList.size().findViewById(R.image).photolist.image). img. 18 . null). } public Object getItem(int position) { // TODO Auto-generated method stub return position. public FriendsAdapter (Context c) { mContext = c.inflate(R. ImageView img = (ImageView) view. } else { // Use convertView if it is available view = convertView. } public long getItemId(int position) { // TODO Auto-generated method stub return position. } public View getView(int position. } Friend friend = (Friend) mList. ViewGroup parent) { if (convertView == null) { // Make up a new view LayoutInflater inflater = (LayoutInflater) mContext .setImageBitmap(friend.

info). t = (TextView) view.findViewById(R. ya que Android solo permite generar listas autom´ticamente basadas en listas o arrays de enteros o strings.xml : o ıa Figure 3: Pantalla de la ActivityList <activity android:name="FriendList"></activity> 19 .name ).info).id.setText(friend. la clase FriendList es una ActivityList o en la cual hemos creado un adaptador personalizado para mostrar la informaci´n en la o lista.id. Observar que el m´todo getFriendList (que no est´ detallado) debe devolver una e a lista con la informaci´n de los amigos.findViewById(R. o Es necesario generar un adaptador para mostrar la lista. return view. como a hemos detallado en el c´digo anterior. } } Como podemos observar en el c´digo anterior. o S´lo quedar´ dar los permisos correspondientes en el archivo Manifest.name).setText( friend.TextView t = (TextView) view. t. Si a queremos generar una lista m´s compleja debemos crear nuestro propio adaptador. t.

add(0.0.MENU_LOCATION_WIFI.setIcon(R.1 Men´ s u Vamos a incorporar un men´ en nuestra aplicaci´n para poder seleccionar si queremos u o utilizar el provider GPS o WiFi para obtener la localizaci´n.mundo). "WIFI"). y m´s en Android.drawable.6 Men´ s y men´ s contextuales u u Los men´s es una parte importante de toda aplicaci´n.FIRST + 2.0. "Location") . return true. private static final int MENU_LOCATION_WIFI = Menu.MENU_LOCATION_GPS.FIRST + 3. private static final int MENU_LOCATION_GPS = Menu. "GPS"). En este apartado o vamos a ver como implementar men´s en pantalla y men´s contextuales sobre listas. break. ya que nos u o a permite mostrar numerosa informaci´n cuando el usuario la solicite. } En el anterior c´digo implementamos el m´todo onCreateOptionsMenu para detallar o e las partes que tendr´ nuestro men´. o private static final int MENU_LOCATION = Menu.addSubMenu (0.getItemId()) { case MENU_LOCATION_GPS: LocationType = LocationManager. sub. En nuestro caso. @Override public boolean onCreateOptionsMenu(Menu menu) { SubMenu sub = menu. MENU_LOCATION.FIRST + 1. u u 6. sub. u @Override public boolean onOptionsItemSelected (MenuItem item) { switch (item.add(0. 0 . 20 .GPS_PROVIDER. hemos creado un men´ principal a u u llamado “Location” que tiene dos sub-men´s “GPS” y “WIFI”.

Por ejemplo. implementamos el m´todo onOptionsItemSelected para definir o e que acciones se llevan a cabo cuando se seleccionan estas opciones en el sub-men´. u o Lo primero que haremos ser´ a˜adir el siguiente c´digo en el m´todo onCreate de la a n o e actividad FriendList: registerForContextMenu(this. } return super.2 Men´ s Contextuales u Los men´s contextuales son aquellos men´s que aparecen dependiendo del contexto que u u tengas en la aplicaci´n. u Figure 4: Pantallas de men´ y sub-men´ u u 6.getListView()).onOptionsItemSelected(item). break. vamos a ver un caso donde podemos mostrar un o men´ contextual cuando se realiza una pulsaci´n prolongada sobre un item de una lista.case MENU_LOCATION_WIFI: LocationType = LocationManager. 21 .NETWORK_PROVIDER. } En el c´digo anterior.

View view.add (0. 0. Friend myFriend = (Friend) mList.notifyDataSetChanged(). mList = getFriendList(). ‘‘Delete Friend’’). ContextMenuInfo menuInfo) { if (friends) { menu.position). 0. switch (item. menu.getMenuInfo(). private static final int MENU_MONITOR_FRIEND = Menu.getId()).FIRST + 1.A continuaci´n sobre-escribiremos el siguiente m´todo para detallar que men´s o e u aparecer´n: a private static final int MENU_DELETE_FRIEND = Menu. } } Y para finalizar.getItemId()) { case MENU_DELETE_FRIEND: deleteFriend(friend. MENU_DELETE_FRIEND.add (0.’’Monitors your Friend’’). @Override public void onCreateContextMenu(ContextMenu menu. MENU_MONITOR_FRIEND. deberemos detallar las acciones que queremos ejecutar cuando se pulsen estos men´s: u @Override public boolean onContextItemSelected(MenuItem item) { AdapterContextMenuInfo info = (AdapterContextMenuInfo) item. case MENU_MONITOR_FRIEND: 22 .FIRST + 2. break. mAdapter.get(info.

} return true. myFriend. estudia bien tu caso y haz un buen uso de ellos. break. } Figure 5: Ejemplo de un men´ contextual u 7 Resumen ˆ Una pantalla = Una actividad = Una clase ˆ El archivo Manifest.putExtra(‘‘userName’’.Intent i = new Intent(this. i. ˆ Comparte tu c´digo: es bueno para ti. es bueno para todos! o Recuerda: 23 . eficiencia y a eficiencia!! ˆ Android te ofrece diferentes tipos de procesos con ciclos de vida diferentes.xml define los permisos y caracter´ ısticas de la aplicaci´n o cuando se ejecuta en el m´vil o ˆ Est´s programando en un sistema empotrado.class).name ).MonitoringMap. piensa en eficiencia.

Sign up to vote on this title
UsefulNot useful