2010-12-15 22 views
18

Me preguntaba si es posible (y si es cómo) iniciar mi aplicación en un momento específico, algo así como un reloj de alarma que se activa a una hora específica. Digamos que quiero que mi aplicación se inicie a las 8 de la mañana, ¿es eso posible?Iniciar la aplicación en un momento específico

+0

El origen de la alarma del reloj - https://android.googlesource.com/platform/packages/apps/DeskClock/+/master/src/com/android – fiction

+0

partir de la aplicación en un horario también puede se logrará mediante la aplicación [AutomateIt] (https://play.google.com/store/apps/details?id=AutomateIt.mainPackage&hl=en). Se puede configurar el temporizador y la aplicación que elija se lanzará en un momento específico. –

+0

Muchos programas de reloj despertador (como Alarm Clock Plus) incluyen la posibilidad de iniciar un programa en un momento determinado, si desea permitir que otro programa haga el trabajo pesado por usted. – Zoot

Respuesta

12

Puede hacerlo con AlarmManager, aquí hay un pequeño ejemplo. En primer lugar es necesario 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, es necesario crear un receptor con algo de código para ejecutar su aplicación: (ie- iniciar su aplicación):

public class MyAppReciever extends BroadcastReceiver { 

@Override 
public void onReceive(Context context, Intent intent) { 

    startActivity(new Intent(context, MyAppMainActivity.class)); 
    } 
} 
+2

Creo que falta algo: am.set (AlarmManager.RTC_WAKEUP, futureDate.getTimeInMillis (), remitente); –

+0

mi objeto Date no tiene el método "getTimeInMillis"() .. – flipperweid

11

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 el servicio en segundo plano inicie, haga su trabajo y se quede sin memoria.

Probablemente no desee iniciar una actividad (si eso es lo que quiso 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 llevar alguna actividad potencialmente no deseada al primer plano.

+0

realmente quiero ejecutar mi actividad principal: entiendo que su enfoque es menos invasivo pero también quiero hacer algo invasivo: P – TiGer

1

hay una muy buen tutorial: http://www.javacodegeeks.com/2012/09/android-alarmmanager-tutorial.html

aquí es el c & t:

Android AlarmManager tutorial por Rakesh Cusa t 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: metainformación sobre el proyecto. Plataforma Versión: Android API de nivel 10. IDE: Eclipse Helios Servicio Release 2 Emulador: Android 4.1

Requisito: el conocimiento preliminar de la estructura de aplicaciones de Android, y el receptor de difusión Intención.

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 está registrado con intención. Cuando se activa una alarma, el intento que se ha registrado con AlarmManager es emitido por el sistema automáticamente. Esta intención inicia la aplicación de destino si no se está ejecutando. Se recomienda utilizar AlarmManager cuando desee que el código de la aplicación se ejecute en un momento específico, incluso si su aplicación no se está ejecutando actualmente. Para otros controles de operación de temporización se debe utilizar porque es fácil de usar. Handler está cubierto en otro tutorial.

Método Descripción set() Programe una alarma por una 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 tiempo de repetición exacto. setTime() Establece el tiempo del reloj de pared del sistema. setTimeZone() Establece la zona horaria predeterminada del sistema. Consulte la documentación de AlarmManager para obtener más información.

En este tutorial aprendamos a crear un temporizador de una sola vez y el temporizador de repetición, y también para 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 Ejemplo:

Vamos a crear tres botones de comenzar la repetición de temporizador, cancelar la repetición de temporizador y el temporizador de una sola vez en el archivo de diseño. Estos botones están conectados con métodos, es decir, startRepeatingTimer, cancelRepeatingTimer y onetimeTimer respecitivamente. Estos métodos se definirán 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 la intención registrado en AlarmManager. En la clase dada se ha definido el método onReceive(). Este método se invoca tan pronto como se recibe la intención. Una vez que recibimos el intento, tratamos de obtener el parámetro adicional asociado con este intento. Este parámetro adicional es definido por el usuario, es decir ONE_TIME, básicamente indica si este intento se asoció con el temporizador de una sola vez o el repetido. Una vez que se ha extraído el valor del parámetro ONE_TIME, se muestra el mensaje Toast en consecuencia. También se han definido métodos de ayuda, que se pueden usar desde otros lugares con la ayuda de objetos, por ejemplo, los métodos setAlarm(), cancelAlarm() y onetimeTimer(). Estos métodos también se pueden definir en otro lugar para realizar operaciones en el temporizador, es decir, establecer, cancelar, etc. Para mantener este tutorial simple, lo hemos definido en BroadcastReceiver.

setAlarm(): Este método establece la alarma que se repite mediante el uso del método setRepeating(). método setRepeating() necesita cuatro argumentos:

tipo de alarma, tiempo de disparo: la puso a la corriente intervalo de tiempo en milisegundos: en este ejemplo estamos pasando de 5 segundos (1000 * 5 milisegundos) intención pendiente: Se se registrará con esta alarma. Cuando se activa la alarma, se emitirá pendienteInternet. cancelAlarm(): este método cancela la alarma previamente registrada llamando al método cancel(). El método cancel() toma pendingIntent como argumento. El pendienteInternet 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(). método set() toma tres argumentos:

tipo de alarma tiempo de activación pendientes intención

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 realiza el archivo de manifiesto. Aquí, se requiere permiso WAKE_LOCK porque se usa el bloqueo de activación durante el procesamiento en el método onReceive() presente en la clase AlarmManagerBroadcastReceiver. AlarmManagerBroadcastReceiver ha sido 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 manejarán 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, solamente ejecuta el proyecto y se encuentra el mismo tipo de aplicación que se ejecuta en el emulador.

Descargue https://github.com/rakeshcusat/Code4Reference/tree/master/AndroidProjects/AlarmManagerExamplecode, si necesita el código de referencia.

Referencia: Tutorial en Android AlarmManager de nuestro socio de JCG Rakesh Cusat en el blog Code4Reference.

http://code4reference.com/2012/07/tutorial-on-android-alarmmanager/

Cuestiones relacionadas