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.

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

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

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

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

0" encoding="utf-8"?> <AbsoluteLayout android:id="@+id/widget0" android:layout_width="fill_parent" android:layout_height="fill_parent" xmlns:android="http://schemas. vamos a pasar a la descripci´n del c´digo de la clase. o <?xml version="1. o o 7 .permission.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.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.<!-. 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.

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

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

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.LENGTH_LONG). o e nos indicar´ que la posici´n GPS ha cambiado y por tanto podemos escribir dicha a o 10 .quit().Looper. } else { Toast. 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. } } 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. Toast. Cuando el m´todo onLocationChanged se llame.sendEmptyMessage(0).myLooper().show(). "Signal GPS not found".makeText(getBaseContext().

dismiss(). Por ultimo.informaci´n en nuestra actividad. Como nos encontramos ejecutando un thread. 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.setText("Current Position: " + currentLocation. } } }.removeUpdates(mLocationListener). 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.toString() ). if (currentLocation!=null) { txtLocation. 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). mLocationManager. por lo que mostramos la informaci´n en el textview txtLocation a o Figure 1: Pantalla de la Activity 11 .

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

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

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

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

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

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

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

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

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

u Figure 4: Pantallas de men´ y sub-men´ u u 6. 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´. break. 21 . 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. } return super.NETWORK_PROVIDER.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.getListView()). 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. } En el c´digo anterior.onOptionsItemSelected(item).

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

myFriend. i. } return true.class). } Figure 5: Ejemplo de un men´ contextual u 7 Resumen ˆ Una pantalla = Una actividad = Una clase ˆ El archivo Manifest. ˆ Comparte tu c´digo: es bueno para ti. piensa en eficiencia.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. 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.MonitoringMap. break.putExtra(‘‘userName’’. es bueno para todos! o Recuerda: 23 .Intent i = new Intent(this.name ).

Sign up to vote on this title
UsefulNot useful