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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

FIRST + 2. } } Y para finalizar. mList = getFriendList().getItemId()) { case MENU_DELETE_FRIEND: deleteFriend(friend. MENU_MONITOR_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.notifyDataSetChanged(). mAdapter. 0. MENU_DELETE_FRIEND.position). ContextMenuInfo menuInfo) { if (friends) { menu. 0. private static final int MENU_MONITOR_FRIEND = Menu. Friend myFriend = (Friend) mList.getMenuInfo().getId()).add (0. View view. @Override public void onCreateContextMenu(ContextMenu menu.add (0.’’Monitors your Friend’’).get(info. menu.FIRST + 1. case MENU_MONITOR_FRIEND: 22 . switch (item. break. ‘‘Delete 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.

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). } return true. break. myFriend. es bueno para todos! o Recuerda: 23 . ˆ Comparte tu c´digo: es bueno para ti. i. piensa en eficiencia. estudia bien tu caso y haz un buen uso de ellos. } 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.MonitoringMap. eficiencia y a eficiencia!! ˆ Android te ofrece diferentes tipos de procesos con ciclos de vida diferentes.name ).