android - programacion - Iniciar la aplicación en un momento específico
manual de programacion android pdf (3)
Me preguntaba si es posible (y si es cómo) iniciar mi aplicación a una hora específica, algo así como un reloj de alarma que suena a una hora específica. Digamos que quiero que mi aplicación se inicie a las 8 de la mañana, ¿es factible?
Probablemente esté buscando AlarmManager , que le permite iniciar servicios / actividades / enviar transmisiones a intervalos específicos o en un momento dado, repitiendo o no. Así es como escribes servicios de fondo amigables con la memoria en Android. AlarmManager
es algo así como cron en unix. Permite que su servicio en segundo plano comience, haga su trabajo y se quede sin memoria.
Probablemente no desee iniciar una actividad (si eso es lo que quiere decir con "aplicación"). Si desea alertar al usuario de que algo ha sucedido, agregue una alarma que inicie un receptor en un momento dado y haga que el receptor agregue una notificación. La notificación puede abrir la aplicación cuando se hace clic. Eso es menos invasivo que traer alguna actividad potencialmente no deseada al primer plano.
Puedes hacerlo con AlarmManager, aquí hay un breve ejemplo. Primero necesitas configurar la alarma:
AlarmManager am = (AlarmManager) con.getSystemService(Context.ALARM_SERVICE);
Date futureDate = new Date(new Date().getTime() + 86400000);
futureDate.setHours(8);
futureDate.setMinutes(0);
futureDate.setSeconds(0);
Intent intent = new Intent(con, MyAppReciever.class);
PendingIntent sender = PendingIntent.getBroadcast(con, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
am.set(AlarmManager.RTC_WAKEUP, futureDate.getTimeInMillis(), sender);
A continuación, debe crear un receptor con algún código para ejecutar su aplicación: (es decir, iniciando su aplicación):
public class MyAppReciever extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
startActivity(new Intent(context, MyAppMainActivity.class));
}
}
hay un muy buen tutorial: http://www.javacodegeeks.com/2012/09/android-alarmmanager-tutorial.html
Aquí está el c & p:
Tutorial de AlarmManager para Android por Rakesh Cusat el 20 de septiembre de 2012 | Archivado en: Android Core
Al escribir una aplicación, surge la necesidad de programar la ejecución del código en el futuro. Puede requerir que AlarmManager programe su trabajo a una hora específica. AlarmManager accede a la alarma del sistema y programa la ejecución del código incluso cuando la aplicación no se está ejecutando. Información del proyecto: Meta-información sobre el proyecto. Versión de plataforma: API de Android de nivel 10. IDE: Eclipse Helios Service Release 2 Emulator: Android 4.1
Requisito previo: conocimiento preliminar del marco de la aplicación de Android y el receptor Intent Broadcast.
AlarmManager:
AlarmManager tiene acceso a los servicios de alarma del sistema. Con la ayuda de AlarmManager puede programar la ejecución del código en el futuro. El objeto AlarmManager no puede crear instancias directamente, pero puede recuperarse llamando a Context.getSystemService (Context.ALARM_SERVICE). AlarmManager siempre se registra con intención. Cuando se activa una alarma, el sistema emite automáticamente la Intención que se ha registrado con AlarmManager. Este intento inicia la aplicación de destino si no se está ejecutando. Se recomienda utilizar AlarmManager cuando desee que el código de su aplicación se ejecute a una hora específica, incluso si su aplicación no se está ejecutando actualmente. Para otros manipuladores de operación de tiempo se debe utilizar porque es fácil de usar. El manejador está cubierto en otro tutorial.
Método Descripción set () Programa una alarma por única vez. setInexactRepeating () Programa una alarma con repetición inexacta. El tiempo de activación no sigue ninguna restricción estricta. setRepeating () Programa una alarma con el tiempo de repetición exacto. setTime () Ajusta la hora del reloj de pared del sistema. setTimeZone () Establece la zona horaria predeterminada del sistema. Echa un vistazo a la documentación AlarmManager para obtener más información.
En este tutorial, aprendamos a crear un temporizador único y el temporizador de repetición, y también a cancelar el temporizador de repetición. Aquí el temporizador y la alarma se han usado indistintamente, pero en este contexto tutorial ambos tienen el mismo significado.
Código de ejemplo:
Vamos a crear tres botones para iniciar el temporizador de repetición, cancelar el temporizador de repetición y el temporizador de una sola vez en el archivo de diseño. Estos botones se adjuntan con métodos, por ejemplo, startRepeatingTimer, cancelRepeatingTimer y onetimeTimer respectivamente. Estos métodos serán definidos en la clase de actividad. El archivo de diseño se muestra a continuación (activity_alarm_manager.xml).
<linearlayout android:layout_height=''match_parent''
android:layout_width=''match_parent'' android:orientation=''vertical''
xmlns:android=''http://schemas.android.com/apk/res/android''
xmlns:tools=''http://schemas.android.com/tools''>
<button android:id=''@+id/btStart'' android:layout_height=''wrap_content''
android:layout_width=''match_parent'' android:onclick=''startRepeatingTimer''
android:padding=''@dimen/padding_medium'' android:text=''@string/btStart''
tools:context=''.WidgetAlarmManagerActivity''/>
<button android:id=''@+id/btCancel'' android:layout_height=''wrap_content''
android:layout_width=''match_parent'' android:onclick=''cancelRepeatingTimer''
android:padding=''@dimen/padding_medium'' android:text=''@string/btCancel''
tools:context=''.WidgetAlarmManagerActivity''/>
<button android:id=''@+id/btOneTime'' android:layout_height=''wrap_content''
android:layout_width=''match_parent'' android:onclick=''onetimeTimer''
android:padding=''@dimen/padding_medium'' android:text=''@string/btOneTime''
tools:context=''.WidgetAlarmManagerActivity''/>
</linearlayout>
Vamos a definir el BroadcastReciever que maneja el intento registrado con AlarmManager. En la clase dada el método onReceive () ha sido definido. Este método se invoca tan pronto como se recibe la intención. Una vez que recibimos la intención, intentamos obtener el parámetro adicional asociado con esta intención. Este parámetro adicional es definido por el usuario, es decir, ONE_TIME, básicamente indica si esta intención se asoció con un temporizador de una sola vez o el que se repite. Una vez que se extrajo el valor del parámetro ONE_TIME, el mensaje de Toast se muestra en consecuencia. Los métodos de ayuda también se han definido, que se pueden usar desde otros lugares con la ayuda de objetos, es decir, los métodos setAlarm (), cancelAlarm () y onetimeTimer (). Estos métodos también se pueden definir en otro lugar para realizar la operación en el temporizador, es decir, configurar, cancelar, etc. Para mantener este tutorial simple, lo hemos definido en BroadcastReceiver.
setAlarm (): este método establece la alarma de repetición mediante el uso del método setRepeating (). El método setRepeating () necesita cuatro argumentos:
tipo de alarma, tiempo de activación: configúrelo en el intervalo de tiempo actual en milisegundos: en este ejemplo estamos pasando 5 segundos (1000 * 5 milisegundos) intención pendiente: se registrará con esta alarma. Cuando se active la alarma, se emitirá el estado pendiente. cancelAlarm (): este método cancela la alarma previamente registrada al llamar al método cancel (). El método cancel () toma pendingIntent como un argumento. El objeto pendiente debe coincidir con uno, solo entonces el método cancel () puede eliminar la alarma del sistema.
onetimeTimer (): este método crea una alarma de una sola vez. Esto se puede lograr llamando al método set (). El método set () toma tres argumentos:
Tipo de alarma Tiempo de activación pendiente de intento.
package com.rakesh.alarmmanagerexample;
import java.text.Format;
import java.text.SimpleDateFormat;
import java.util.Date;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.PowerManager;
import android.widget.Toast;
public class AlarmManagerBroadcastReceiver extends BroadcastReceiver {
final public static String ONE_TIME = ''onetime'';
@Override
public void onReceive(Context context, Intent intent) {
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, ''YOUR TAG'');
//Acquire the lock
wl.acquire();
//You can do the processing here.
Bundle extras = intent.getExtras();
StringBuilder msgStr = new StringBuilder();
if(extras != null && extras.getBoolean(ONE_TIME, Boolean.FALSE)){
//Make sure this intent has been sent by the one-time timer button.
msgStr.append(''One time Timer : '');
}
Format formatter = new SimpleDateFormat(''hh:mm:ss a'');
msgStr.append(formatter.format(new Date()));
Toast.makeText(context, msgStr, Toast.LENGTH_LONG).show();
//Release the lock
wl.release();
}
public void SetAlarm(Context context)
{
AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class);
intent.putExtra(ONE_TIME, Boolean.FALSE);
PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0);
//After after 5 seconds
am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1000 * 5 , pi);
}
public void CancelAlarm(Context context)
{
Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class);
PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, 0);
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
alarmManager.cancel(sender);
}
public void setOnetimeTimer(Context context){
AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class);
intent.putExtra(ONE_TIME, Boolean.TRUE);
PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0);
am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), pi);
}
}
A continuación se muestra el archivo de manifiesto. Aquí, se requiere el permiso WAKE_LOCK porque el bloqueo de activación se está utilizando mientras se procesa en el método onReceive () presente en la clase AlarmManagerBroadcastReceiver. AlarmManagerBroadcastReceiver se ha registrado como receptor de difusión.
<manifest android:versioncode=''1'' android:versionname=''1.0''
package=''com.rakesh.alarmmanagerexample''
xmlns:android=''http://schemas.android.com/apk/res/android''>
<uses-sdk android:minsdkversion=''10'' android:targetsdkversion=''15''/>
<uses-permission android:name=''android.permission.WAKE_LOCK''/>
<application android:icon=''@drawable/ic_launcher''
android:label=''@string/app_name'' android:theme=''@style/AppTheme''>
<activity android:label=''@string/title_activity_alarm_manager''
android:name=''com.rakesh.alarmmanagerexample.AlarmManagerActivity''>
<intent-filter>
<action android:name=''android.intent.action.MAIN''/>
<category android:name=''android.intent.category.LAUNCHER'' />
</intent-filter>
</activity>
<receiver android:name=''com.rakesh.alarmmanagerexample.AlarmManagerBroadcastReceiver''>
</receiver>
</application>
</manifest>
Ahora definamos la clase de actividad que define algunos métodos. Estos métodos van a manejar los clics del botón. Aquí en esta clase, creamos una instancia de AlarmManagerBroadcastReciever que nos ayudará a acceder a setAlarm (), cancelAlarm () y setOnetime (). El resto del código es fácil de entender.
package com.rakesh.alarmmanagerexample;
import com.rakesh.alarmmanagerexample.R;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;
import android.support.v4.app.NavUtils;
public class AlarmManagerActivity extends Activity {
private AlarmManagerBroadcastReceiver alarm;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_alarm_manager);
alarm = new AlarmManagerBroadcastReceiver();
}
@Override
protected void onStart() {
super.onStart();
}
public void startRepeatingTimer(View view) {
Context context = this.getApplicationContext();
if(alarm != null){
alarm.SetAlarm(context);
}else{
Toast.makeText(context, ''Alarm is null'', Toast.LENGTH_SHORT).show();
}
}
public void cancelRepeatingTimer(View view){
Context context = this.getApplicationContext();
if(alarm != null){
alarm.CancelAlarm(context);
}else{
Toast.makeText(context, ''Alarm is null'', Toast.LENGTH_SHORT).show();
}
}
public void onetimeTimer(View view){
Context context = this.getApplicationContext();
if(alarm != null){
alarm.setOnetimeTimer(context);
}else{
Toast.makeText(context, ''Alarm is null'', Toast.LENGTH_SHORT).show();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_widget_alarm_manager, menu);
return true;
}
}
Una vez que haya terminado con la codificación, simplemente ejecute el proyecto y encontrará el tipo de aplicación similar que se ejecuta en su emulador.
Descargue https://github.com/rakeshcusat/Code4Reference/tree/master/AndroidProjects/AlarmManagerExamplecode , si necesita un código de referencia.
Referencia: Tutorial sobre el AlarmManager de Android de nuestro socio de JCG Rakesh Cusat en el blog Code4Reference.
http://code4reference.com/2012/07/tutorial-on-android-alarmmanager/