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.

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

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

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

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. vamos a pasar a detallar la implementaci´n de alguno de o estos procesos. Este tipo de procesos no son visibles y suelen ser e importantes para el usuario (conexi´n con servidores. ´ ˆ Empty Process: Es un proceso que no aloja ning´n componente. 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(). 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. reproducci´n de m´sica). a o simple. Es com´n. Es muy usual que existan numerosos procesos de este tipo en el sistema. que el sistema elimine este tipo de procesos con frecuencia o u para obtener memoria disponible. ´ ˆ Visible Process: Es un proceso que aloja una activity pero no est´ en primera a plano (su m´todo onPause() ha sido llamado). Adem´s no hay que olvidarse de dar los permisos oportunos en el archivo Manifest. 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). Normalmente la e eliminaci´n de estos procesos no suponen un gran impacto para la actividad del o usuario. <!-. Esto ocurre en situaciones donde la e aplicaci´n muestra una cuadro de dialogo para interactuar con el usuario. 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. Este tipo de procesos ser´n o a a a eliminados como ultimo recurso si el sistema necesitase memoria.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.ˆ 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.xml a para ejecutar la actividad y para tener acceso al GPS.Activity permission --> <activity android:name="LocationActivity"></activity> 6 . 5. o En un proyecto nuevo o existente es necesario crear la actividad LocationActivity.

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

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

mLocationListener).loop().OnCancelListener dialogCancel = new DialogInterface. Looper. if (mLocationManager. el m´todo writeSignalGPS instancia un ’processDialog’ para que se e muestre en pantalla mientras se encuentra la posici´n GPS. pd = ProgressDialog. mLocationManager.prepare(). Thread thread = new Thread(this). thread. dialogCancel). 9 . true.GPS_PROVIDER)) { Looper.OnCancelListener() { public void onCancel(DialogInterface dialog) { } }.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. "Searching.isProviderEnabled(LocationManager. true.". 0.. } Como vemos.. 0. mLocationListener = new MyLocationListener().requestLocationUpdates( LocationType. "Searching GPS Signal".start().show(this.

} else { Toast. 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. "Signal GPS not found". Toast.show(). 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.makeText(getBaseContext(). } } En el c´digo anterior del thread podemos ver como se configura el provider de GPS o como fuente de localizaci´n.Looper. o e nos indicar´ que la posici´n GPS ha cambiado y por tanto podemos escribir dicha a o 10 .quit(). } } 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.LENGTH_LONG).myLooper().

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

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

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

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

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

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

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

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

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

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

21 . Por ejemplo. break. vamos a ver un caso donde podemos mostrar un o men´ contextual cuando se realiza una pulsaci´n prolongada sobre un item de una lista. } En el c´digo anterior. 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.onOptionsItemSelected(item).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. u Figure 4: Pantallas de men´ y sub-men´ u u 6. } return super. 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.

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

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

Sign up to vote on this title
UsefulNot useful