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.

. . . . . . . . . . . . 15 6 Men´ s y men´ s contextuales u u 20 6. . . . . . . . . . . . . . . . . . . . . . . . . . .1 Desarrollo 5. .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. . . . . . . . . . . . . . . . . . . . . . .2 Desarrollo 5. . . .1 Men´s . .2 Men´s Contextuales . . . . . . . . . . . . . . . 20 u 6. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3 Desarrollo 4 4 4 5 Android 6 de una ’Activity’ . . . . . 12 de una ’ActivityList’ . . . . . 6 de una ’ActivityMap’ . . . . . . . . . . 21 u 7 Resumen 23 3 . . . .

Android provee cuatro tipos diferentes de o o componentes: 1 http://en. o o ˆ te describir´ los distintos procesos existentes en Android. a ˆ te ayudar´ a realizar tu primera aplicaci´n Android. o o o Desde su lanzamiento. 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. 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..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.org/wiki/Open Handset Alliance 4 . gps y servicios en tu aplicaci´n Android.. ıa ˆ es un documento avanzado sobre programaci´n en JAVA/Android. activityMap.1 Introducci´n o Android es el sistema operativo de Google especialmente dise˜o para ejecutar en n dispositivos m´viles.) n a ˆ es un documento explicativo sobre la filosof´ de 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.android. o Lecturas recomendadas sobre esta secci´n: o ˆ What is Android? http://developer. numerosos programadores han encontrado en este sistema operativo la primera plataforma de programaci´n sencilla. a o ˆ te ense˜ar´ a utilizar mapas. potente y fiable para o programar en sistemas m´viles. activityList y services.com/guide/basics/what-is-android. n a o Este documento NO: ˆ te ense˜ar´ a instalar el entorno (sdk. eclipse .wikipedia.

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

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

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.xml) de la interfaz y los permisos correspondientes.GPS permission --> <uses-permission android:name="android.0" encoding="utf-8"?> <AbsoluteLayout android:id="@+id/widget0" android:layout_width="fill_parent" android:layout_height="fill_parent" xmlns:android="http://schemas.android. o <?xml version="1.<!-.permission.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. vamos a pasar a la descripci´n del c´digo de la clase. Ser´ una interfaz sencilla donde tendremos un bot´n y un a a o textview para mostrar nuestra localizaci´n. o o 7 .

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

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

makeText(getBaseContext(). o e nos indicar´ que la posici´n GPS ha cambiado y por tanto podemos escribir dicha a o 10 .myLooper().LENGTH_LONG). 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. Toast. Cuando el m´todo onLocationChanged se llame.sendEmptyMessage(0). o private class MyLocationListener implements LocationListener { public void onLocationChanged(Location loc) { if (loc != null) { handler. int status. } } En el c´digo anterior del thread podemos ver como se configura el provider de GPS o como fuente de localizaci´n.quit().show(). "Signal GPS not found". } } 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. } else { Toast.Looper.

} } }. por lo que mostramos la informaci´n en el textview txtLocation a o Figure 1: Pantalla de la Activity 11 .removeUpdates(mLocationListener). Como nos encontramos ejecutando un thread.informaci´n en nuestra actividad. 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). 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. private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { pd. Por ultimo.toString() ).setText("Current Position: " + currentLocation. mLocationManager. if (currentLocation!=null) { txtLocation. Por ello vamos a utilizar el mecanismo de paso de a mensajes que Android implementa como Handlers.dismiss().

Para generar la clave seguir los siguientes pasos: $ keytool -list -keystore ~/. vamos a ver el c´digo necesario a o para mostrar nuestra localizaci´n en dicho mapa. Lo primero que tenemos que hacer es heredar de la actividad MapActivity public class LocationActivity extends MapActivity implements Runnable.google..android/debug. o private void showMap() { 12 . Cuando obtengas tu clave guardala en un sitio seguro y a˜´dela al layout.android. concretamente en la etiqueta na android:apiKey.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.google.xml la siguiente declaraci´n: ´ o n o <uses-library android:name="com. OnClickListener A˜adiremos en el layout el widget del mapa: n { <view class="com.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.maps. 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. necesitamos un apiKey para poder utilizar los mapas de google desde Android.google.html y obtener tu clave a partir del MD5 que se ha generado anteriormente.com/intl/es-ES/android/maps-api-signup..android.2 Desarrollo de una ’ActivityMap’ Una vez que sabemos desarrollar sin problemas una activity.5. Por ultimo s´lo nos queda a˜adir en el archivo Manifest. vamos a ver como incluir un mapa (google maps) en dicha actividad.keystore .

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

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

vamos a dise˜ar el layout. } [. o n 15 . En nuestro ejemplo.setText("Current Position: " + currentLocation. // This method show our position in the map. vamos a mostrar una lista o con informaci´n de nuestros amigos. showMap().] } Figure 2: Pantalla de la ActivityMap 5..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.nuestra posici´n en el mapa.... 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.] if (currentLocation!=null) { txtLocation. Por tanto lo primero.toString() ).

<?xml version="1.android.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 .0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.

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

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

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

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

} 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. 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. Por ejemplo. } En el c´digo anterior.case MENU_LOCATION_WIFI: LocationType = LocationManager. implementamos el m´todo onOptionsItemSelected para definir o e que acciones se llevan a cabo cuando se seleccionan estas opciones en el sub-men´.onOptionsItemSelected(item). 21 . break.NETWORK_PROVIDER. 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. u Figure 4: Pantallas de men´ y sub-men´ u u 6.getListView()).

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

} Figure 5: Ejemplo de un men´ contextual u 7 Resumen ˆ Una pantalla = Una actividad = Una clase ˆ El archivo Manifest.putExtra(‘‘userName’’. eficiencia y a eficiencia!! ˆ Android te ofrece diferentes tipos de procesos con ciclos de vida diferentes.MonitoringMap.Intent i = new Intent(this.name ). es bueno para todos! o Recuerda: 23 . estudia bien tu caso y haz un buen uso de ellos.class). break.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. myFriend. } return true. piensa en eficiencia. i. ˆ Comparte tu c´digo: es bueno para ti.