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.

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

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

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

Adem´s no hay que olvidarse de dar los permisos oportunos en el archivo Manifest. 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. o En un proyecto nuevo o existente es necesario crear la actividad LocationActivity. Es muy usual que existan numerosos procesos de este tipo en el sistema.Activity permission --> <activity android:name="LocationActivity"></activity> 6 . 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. 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). Es com´n.1 Desarrollo de una ’Activity’ El primer ejemplo pr´ctico que vamos a ver es la creaci´n de una actividad sencilla. que el sistema elimine este tipo de procesos con frecuencia o u para obtener memoria disponible. 5 Desarrollo en Android Una vez que hemos explicado los diferentes procesos y sus ciclos de vida dentro del sistema operativo Android. reproducci´n de m´sica). ´ ˆ 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. Normalmente la e eliminaci´n de estos procesos no suponen un gran impacto para la actividad del o usuario. ˆ Service Process: Es un proceso que aloja un service que ha sido iniciado con el m´todo startService().ˆ 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. a o simple. 5. 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. 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). 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. Esto ocurre en situaciones donde la e aplicaci´n muestra una cuadro de dialogo para interactuar con el usuario.xml a para ejecutar la actividad y para tener acceso al GPS.

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

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

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

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

Por ello vamos a utilizar el mecanismo de paso de a mensajes que Android implementa como Handlers.informaci´n en nuestra actividad.dismiss(). Por ultimo. mLocationManager. if (currentLocation!=null) { txtLocation. por lo que mostramos la informaci´n en el textview txtLocation a o Figure 1: Pantalla de la Activity 11 .removeUpdates(mLocationListener). private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { pd.toString() ). no o podemos acceder a la interfaz gr´fica para modificar el textview (es una caracter´ a ıstica t´ ıpica de los sistemas gr´ficos). } } }. podemos ver como el manejador que hemos implementado es llamado ´ cuando se encuentra la posici´n GPS y por tanto desde aqu´ si podemos actualizar la o ı interfaz gr´fica.setText("Current Position: " + currentLocation. Como nos encontramos ejecutando un thread.

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

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

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

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

<?xml version="1.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center_vertical" android:paddingTop="3dip" android:paddingBottom="3dip" > <ImageView android:id="@+id/image" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <LinearLayout android:layout_width="0dip" android:layout_weight="1" android:layout_marginLeft="6dip" android:layout_marginRight="6dip" android:layout_height="wrap_content" android:orientation="vertical" > <TextView android:id="@+id/name" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textSize="18dip" android:maxLines="2" android:textColor="?android:attr/textColorPrimary" /> <TextView android:id="@+id/info" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textSize="16dip" android:maxLines="3" 16 .0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.

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

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

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

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

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

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

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