2011-01-10 22 views
20

Tengo un problema con AlarmManager, configuro el código para programar una alarma de repetición y después de ejecutar la aplicación, la alarma funciona bien. Incluso si hago clic en el botón de Inicio (y la aplicación está en pausa), la alarma aún se ejecuta en su intervalo.La alarma de Android se cancela después de cerrar la aplicación

El problema es que si abro el Administrador de tareas y fuerzo a cerrar la aplicación, la alarma deja de ejecutarse.

¿Es este un comportamiento normal, hay alguna forma de evitar esto y mantener la alarma en funcionamiento después de cerrar la aplicación?

El código está debajo - el método es llamado por la clase ApplicationContext, onCreate(). código

private void scheduleAlarm() { 
    if (alarmScheduled == true) { return; } // we only need to schedule once. 

    int alarmInterval = Def.pref(getApplicationContext()).getInt("alarmInterval", 30); 

    final Intent intent = new Intent(getApplicationContext(), CollectorAlarmReceiver.class); 
    final PendingIntent pending = PendingIntent.getBroadcast(getApplicationContext(), 0, intent, 0); 

    AlarmManager alarmMgr = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE); 

    alarmMgr.cancel(pending); // cancel others. 

    alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+1000, 
    alarmInterval*1000, pending); 

    Def.log(TAG,"scheduleAlarm(): alarm scheduled, interval: "+alarmInterval+" seconds"); 
    alarmScheduled = true; 
} 

receptor:

public void onReceive(Context context, Intent intent) { 
    Log.i(TAG, "CollectorAlarmReceiver invoked, starting CollectorService in background"); 

    context.startService(new Intent(context, CollectorService.class)); 

    Intent collectorService = new Intent(context,CollectorService.class); 
    collectorService.putExtra("action", CollectorService.ACTION_BACKGROUND_REQUEST_MESSAGES); 

    context.sendBroadcast(collectorService); 
} 

Gracias!

+0

¿Se puede publicar el código de su receptor y un ejemplo de lo que sería AlarmInterval? – ninjasense

+0

Publiqué el código para Receiver. El interval de alarma es de 30 segundos. Puede ver que hay un Log in the onReceive, entonces puedo rastrear cuando se invoca Receiver. Y al ejecutar la aplicación, funciona bien, el problema es cuando está cerrado. –

+0

¿Por qué no configura una alarma en el reloj predeterminado del sistema? Luego, elimínelo mediante el administrador de tareas y vea si se comporta como su aplicación. Si tampoco puede alarmarte. Creo que está bien para su aplicación y no necesita hacer nada. –

Respuesta

6

Esto es comportamiento normal. Si el usuario forza voluntariamente a detener la aplicación, entonces debe detenerse. De lo contrario, estás creando una aplicación similar a virus.

Si realmente lo desea, puede escribir otro servicio que supervise si el otro servicio se está ejecutando y ejecuta el servicio si el otro no se está ejecutando. Pero esta será otra aplicación y (esperas) el usuario no matará esta aplicación usando el administrador de tareas.

Personalmente, no me preocuparía. Si el usuario lo detuvo, querían detenerlo. No molestes al usuario.

+18

No estoy de acuerdo ya que hay muchas aplicaciones que lo harán con buenas intenciones en mente, como un simple reloj despertador. Además, Android no tiene la intención de matar a las tareas a través de un asesino de tareas. – ninjasense

+0

Sí, en mi caso, quiero reproducir el comportamiento del servicio "ping" de Foursquare, donde puede recibir notificaciones incluso después de cerrar la aplicación Foursquare. La aplicación de Facebook hace lo mismo, pero creo que usa C2DM. ¿Es C2DM la única forma de hacerlo sin tener un servicio en la memoria? –

+0

Usted hace un gran punto. Pero, ¿qué ocurre con las personas que usan TaskKiller? No saben que hacerlo significa que las alarmas no se dispararán. Preferiría no hacer una segunda aplicación que supervise la aplicación real para asegurarse de que las alarmas estén configuradas. ¿Algunas ideas? (Sé que es una publicación antigua). – Andy

1

Forzar el cierre de la aplicación no es la forma correcta de cerrar una aplicación y puede dar lugar a un comportamiento incorrecto.

Esto question también podría ser de alguna ayuda.

0

He podido hacer exactamente lo que necesita. Incluso si detiene la aplicación a través de la pestaña de ejecución en la herramienta del administrador de aplicaciones, el servicio se reinicia. La única manera de matarlo es mediante el botón de parada forzada junto a la opción de unistall en el administrador de aplicaciones. Básicamente llama al Servicio directamente. Aquí está mi código:

public class TestService extends Service { 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
     Toast.makeText(this, "Ejecutando Servicio ...", Toast.LENGTH_SHORT).show(); 
    return Service.START_NOT_STICKY;  
    } 

@Override 
    public void onCreate() { 
     super.onCreate(); 
     Toast.makeText(this, "Iniciando Servicio ...", Toast.LENGTH_SHORT).show(); 
} 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     Toast.makeText(this, "Deteniendo Servicio ...", Toast.LENGTH_SHORT).show(); 
} 

En la actividad del cliente escribir el siguiente código:

  Calendar cal = Calendar.getInstance(); 
     Intent intent = new Intent(this,TestService.class); 
     PendingIntent pIntent = PendingIntent.getService(this.getApplicationContext(), 0, intent, 0); 
     alarm= (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
     alarm.setRepeating(AlarmManager.RTC_WAKEUP,cal.getTimeInMillis(), 3*1000, pIntent); 

y declarar el servicio en el manifiesto:

 <service 
     android:name="TestService" 
     android:icon="@drawable/ic_launcher" 
     android:label="TestService" 
     > 
    </service>   
+0

El servicio es el camino a seguir @Igor, necesito más ayuda con usted sobre el material de servicio que hace una alarma, lo usé pero parece que no funciona bien, ¿me puede ayudar y verificar mi código? –

+0

Esto es link1 https://github.com/huxaiphaer/DiabeticsApp/blob/master/Droid/AlarmReceiver.cs link2. https://github.com/huxaiphaer/DiabeticsApp/blob/master/Droid/AppStickyService.cs –

+0

¿Quizás este enlace puede ayudar? http://www.truiton.com/2014/09/android-service-broadcastreceiver-example/ –

7

Creo @GSree está mal. Hay una manera simple de lograr esto. Solo usa una acción personalizada. Así es como:

En primer lugar, definir un nombre de acción personalizada, como por ejemplo:

public static final String MY_ACTION = "com.sample.myaction" 

continuación, crear un BroadcastReceiver:

public class MyAlarmReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     if (intent.getAction().equals(MY_ACTION)) { 
      // Do something here 
     } 
    }  
} 

Registre el receptor en su AndroidManifest.xml:

<receiver android:name="com.sample.MyAlarmReceiver"> 
    <intent-filter> 
     <action android:name="com.sample.myaction"/> 
    </intent-filter> 
</receiver> 

Entonces, para configurar la alarma, utilice el siguiente PendingIntent:

Intent i = new Intent(MY_ACTION); 
PendingIntent pi = PendingIntent.getBroadcast(getApplicationContext(), 0, i, 0); 

Puede haber otras maneras de hacerlo, pero me trató esta solución y la BroadcastReceiver es llamada incluso si fuerce-salga de mi aplicación desde el caparazón.

Observe cómo esta solución no requiere la creación de un servicio.

+4

intenté esto, no funciona después de forzar el cierre de mi aplicación, estoy usando android 4.2.1. Solo funciona cuando toco el botón de inicio (la aplicación solo se pausa, no se cancela). ¿Alguna idea de por qué? –

+0

¿Alguien encontró un problema en kitkat y en la plataforma OS? esta solución no funciona allí por favor ayuda – KOTIOS

+0

hombre alguna respuesta? –

1

He hecho esto algunas veces, pero me pregunto por qué estás asignando un requestCode de 0; Pensaría que dar a su alarma un número único ayudaría mucho.

1

Añadir

<receiver android:name=".AlarmReceiver" android:process=":remote" />

en el archivo de manifiesto. La alarma funcionará incluso si se mata la aplicación.

+6

Bienvenido a StackOverflow.Tenga cuidado al agregar una respuesta a un hilo viejo con varias otras respuestas, especialmente cuando una de ellas ha sido aceptada. Debe explicar por qué su respuesta es mejor que cualquiera de las existentes. – APC

3

¡Es un comportamiento normal! La alarma dejará de funcionar cuando su aplicación vaya a onDestroy().

+0

esto podría agregarse como comentario –

+0

No puedo comentar menos reputación! –

+0

lo hacen por una razón lol – quemeful

Cuestiones relacionadas