Volvemos tras un paréntesis a la quincenal cita de “Aprendiendo android”.
Esta, si no me fallan las cuentas, es la décima entrega de esta sección, en ella hemos hablado de muchos temas o métodos de hacer cosas, pero sobre todo, y es en lo que más me gusta insistir, en las bases de las cosas.
Voy a intentar explicarme, por ejemplo, en esta quincena y tras consultar los mails o tweets que tenía recibido con peticiones sobre las temáticas, vamos a hablar de cómo hacer para ejecutar métodos, actividades, servicios, etc, al iniciarse el móvil… Como a lo mejor algunos recordáis, me gusta ver que es lo que se va pidiendo y hablar sobre el tema.
Bien, pues yo pondré aquí un código, intentaré explicar lo mejor posible ese código por partes, para que quede todo lo más clarito posible y después viene lo realmente importante, el como aplicar ese código, como cambiarlo, mejorarlo, implantarlo con variaciones en vuestros propios programas…
Lo que me gustaría transmitir es la base del “como” para que la imaginación que todos tenemos, haga el resto con lustras aplicaciones :) De modo que dicho esto… manos a la obra. Cuando reiniciamos nuestro móvil y nos pide el código pin, se inician una serie de comprobaciones del propio sistema operativo y de las aplicaciones que lo tengas así estipulado. Esto es precisamente lo que vamos a hacer aquí, añadir comprobaciones o acciones que se van a ejecutar automáticamente al reiniciar el móvil. Vamos a hacer dos códigos diferentes para que nos queden claras las posibilidades que tiene esto.
En primer lugar vamos a generar una “mini” app con dos actividades, la primera, una normal y corriente sin absolutamente nada… bueno, la llamada a nuestro main.xml
//
public class pruebas extends Activity {
@Override public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);}
}
Como decíamos, una actividad completamente normal y por otro lado vamos a generar un xml con un entorno gráfico a gusto del consumidor, yo personalmente he puesto el logo de “El Androide Libre” y un pequeño texto.
Aquí cada uno que ponga lo que quiera, pero para ir haciendo el ejemplo lo más básico posible, no os compliquéis mucho la vida.
Ahora vamos con la segunda actividad que vamos a crear, yo para este ejemplo la he llamado “arrancando”.
Os pongo el código y lo vemos completo:
//
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;public class arrancador extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {// Accion a realizar al inicir el móvil
Intent i = new Intent(context, pruebas.class); // aqui llama a la clase que comienza la app
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(i);
}
}
Bien, no se trata de nada complicado, es una clase que extiende en vez de una actividad de un BroadcastReceiver… en este punto simplificaremos que un BroadcastReceiver es usado para o ejecutar códigos en reacción a un evento producido, este proceso se hace en background. El evento que vamos a usar va a ser el boot o reinicio del móvil :)
Si volvemos a ver el código vemos que lo que está ejecutando nuestra actividad arrancador es un intent (Ver entrega nº 2 de esta sección) que llama a una actividad, en este caso la que siempre llamamos en esta sección “pruebas”.
Es decir, la secuencia sería, arranca el móvil, nos pide el pin, al ponerlo empizan las comprobaciones y entre ellas ejecuta “arrancador” y “arrancador” llama a la actividad “pruebas” la cual va a mostrar el xml con el entorno gráfico que hemos hecho, por lo que mientras arranca el móvil, nos mostrará nuestra pantalla.
¡IMPORTANTE!
Todo esto no sirve absolutamente de nada sin pasar por el siempre todopoderoso manifest. ¿Qué vamos a hacer en el manifest? Pues dos cosas, en primer lugar vamos a declarar “arrancador” como <receiver> y le vamos a decir a que tiene que reaccionar… lógicamente al inicio del sistema o reinicio del móvil, como queráis. Y en segundo lugar añadir el permiso necesario… ¡ains los permisos! :)
Os pongo el manifest completo donde se puede ver claramente todo:
//
<?xml version=»1.0″ encoding=»utf-8″?>
<manifest xmlns:android=»http://schemas.android.com/apk/res/android»
package=»vierco.com.pruebas»
android:versionCode=»1″
android:versionName=»1.0″>
<uses-permission
android:name=»android.permission.RECEIVE_BOOT_COMPLETED»></uses-permission><application android:icon=»@drawable/icon» android:label=»@string/app_name»>
<activity android:name=».pruebas»>
<intent-filter>
<action android:name=»android.intent.action.MAIN» />
<category android:name=»android.intent.category.LAUNCHER» />
</intent-filter>
</activity><receiver android:enabled=»true» android:name=»arrancador»
android:permission=»android.permission.RECEIVE_BOOT_COMPLETED»>
<intent-filter>
<action android:name=»android.intent.action.BOOT_COMPLETED» />
<category android:name=»android.intent.category.DEFAULT» />
</intent-filter>
</receiver>
</application>
<uses-sdk android:minSdkVersion=»4″ /></manifest>
El permiso que nos a requerir el sistema para permitirnos esta acción es como podemos ver en el manifest:
<uses-permission android:name=»android.permission.RECEIVE_BOOT_COMPLETED»></uses-permission>
Y la forma en que hemos declarado la actividad que extiende de BroadcastReceiver es:
<receiver android:enabled=»true» android:name=»arrancador» android:permission=»android.permission.RECEIVE_BOOT_COMPLETED»>
<intent-filter>
<action android:name=»android.intent.action.BOOT_COMPLETED» /><category android:name=»android.intent.category.DEFAULT» />
</intent-filter>
</receiver>
Donde indicamos que la acción al tener en cuenta es el BOOT o reinicio del terminal.
Si con esto ejecutamos nuestro código tendremos que al insertar el pin, veremos como el móvil nos muestra nuestra pantalla gráfica mientras continua en background arrancando de forma normal el terminal. Decía al principio que lo que pretendo explicar es la base de las cosas, el “como” para que después todos lo apliquemos a lo qeu más nos convenga y nos dicte nuestra imaginación. Veamos un ejemplo de eso, pongamos que queremos que al iniciarse el terminal se muestre algo que pueda interactuar con nosotros, una caja de dialogo por ejemplo con un botón. Para realizar esto únicamente deberemos modificar la actividad inicial “pruebas” ya que la de “arrancador” siempre va a cumplir la misma misión. Pongamos que al ejecutarse el onCreate, llame a un método con un AlertDialog (Ver también entrega nº1 de esta sección).
Pues simplemente modificamos el código a esto:
//
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;public class pruebas extends Activity {
public void dialogo (){
AlertDialog.Builder alt_bld = new AlertDialog.Builder(this);
alt_bld.setMessage(«hola»)
.setCancelable(false)
.setNegativeButton(«Muy bien», new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
// Action for ‘NO’ Button
dialog.cancel();
}
});
AlertDialog alert = alt_bld.create();
// Title for AlertDialog
alert.setTitle(«Móvil reiniciado»);
alert.show();
}@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.main);
dialogo();}
}
El resultado es así:
¿Cuál es la ventaja de esto? Pues que ya estamos haciendo que el teléfono interactúe con nosotros antes de empezar a hacer nada (pero claro, no olvidemos que esta arrancando en background), pensad en las posibilidades, en vez de un botón podemos poner dos, uno que simplemente cierre el cuadro de dialogo y otro que lance una aplicación en concreto, o que haga alguna acción que vaya ligada a la aplicación que estemos haciendo o tengamos pensada hacer.
En fin, como siempre digo, las posibilidades son tantas como ideas haya, os animo a que probéis con el código, lo manipuléis y le saquéis todo el partido que se le puede sacar porque repito, como siempre, la programación requiere de conocimientos, pero sobre todo de ganas, ilusión y originalidad.
En esta ocasión, y con permiso de la casa, ya que hemos estado varios meses sin publicar esta sección, os dejo un enlace a mi blog donde tenéis enlazadas a elandroidelibre.com las 9 anteriores entregas.
Saludos!
Vierco