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

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

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

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

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.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. o o 7 .permission.android. Ser´ una interfaz sencilla donde tendremos un bot´n y un a a o textview para mostrar nuestra localizaci´n.<!-.xml) de la interfaz y los permisos correspondientes. o <?xml version="1. vamos a pasar a la descripci´n del c´digo de la clase.

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

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

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

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

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

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

point. paint. canvas.mRadius.} @Override public void draw(Canvas canvas. 5. String text = "My Name".3*mRadius. canvas. } Por ultimo.setAntiAlias(true). paint). Point point= new Point(). point.toPixels(geoPoint.setAntiAlias(true). RectF backRect = new RectF ( point.0).drawRoundRect(backRect.x .0).getProjection().0. point. backPaint. canvas.y . 5.y + mRadius).x + 2*mRadius. Projection projection = mapView.drawOval(oval. boolean shadow) { GeoPoint geoPoint = new GeoPoint( (int) (myLocation.255. (int) (myLocation.getLatitude() * 1000000). point.x + 2 + mRadius.drawText (text. se llame al m´todo showMap que es el encargado de mostrar n e 14 .x + 60. Paint paint = new Paint().x + mRadius. point.0.y . point.setARGB(175. MapView mapView. backPaint. point.getLongitude() * 1000000)). Paint backPaint = new Paint(). point.0. paint. RectF oval = new RectF (point. paint.y.setARGB(250.setFakeBoldText(true).y + mRadius). point). projection. backPaint). 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).mRadius.

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

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

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

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

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

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

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

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

Sign up to vote on this title
UsefulNot useful