android - silenciado - sonido de alarma despertador
La alarma de Android se cancela después de cerrar la aplicación. (7)
¡Eso es un comportamiento normal! La alarma dejará de funcionar cuando su aplicación vaya a onDestroy ().
Tengo un problema con AlarmManager, configuro el código para programar una alarma repetitiva y, después de ejecutar la aplicación, la alarma funciona bien. Incluso si hago clic en el botón Inicio (y la aplicación está en pausa), la alarma aún se ejecuta en su intervalo.
El problema es que si abro el Administrador de tareas y fuerzo el cierre de la aplicación, la alarma deja de funcionar.
¿Es este un comportamiento normal? ¿Hay alguna forma de evitarlo 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 ().
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;
}
Código del 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!
Añadir
<receiver android:name=".AlarmReceiver" android:process=":remote" />
en archivo manifiesto. La alarma funcionará incluso si se mata la aplicación.
Creo que @GSree está equivocado. Hay una manera simple de lograr esto. Solo usa una acción personalizada. Así es cómo:
Primero, defina un nombre de acción personalizado, tal como:
public static final String MY_ACTION = "com.sample.myaction"
Luego crea 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>
Luego, para configurar la alarma, use el siguiente PendingIntent:
Intent i = new Intent(MY_ACTION);
PendingIntent pi = PendingIntent.getBroadcast(getApplicationContext(), 0, i, 0);
Puede haber otras formas de hacerlo, pero probé esta solución y llamé al BroadcastReceiver incluso si salgo por la fuerza de mi aplicación desde el shell.
Observe cómo esta solución no requiere que cree un servicio.
Este es un comportamiento normal. Si el usuario obliga voluntariamente a detener la aplicación, debe detenerse. De lo contrario, estás creando una aplicación similar a un virus.
Si realmente lo desea, puede escribir otro servicio que supervise si su otro servicio se está ejecutando y ejecuta el servicio si el que no se está ejecutando. Pero esta será otra aplicación y (usted espera) el usuario no eliminará esta aplicación utilizando el administrador de tareas.
Personalmente, no me preocuparía. Si el usuario lo paraba, quería pararlo. No molestes al usuario.
Forzar el cierre de su aplicación no es la forma correcta de cerrar una aplicación y puede provocarle un comportamiento incorrecto.
Esta question también podría ser de alguna ayuda.
He hecho esto unas cuantas veces, pero me pregunto por qué asignará un código de solicitud de 0; Pensaría que dar un número único a tu alarma ayudaría mucho.
He podido hacer exactamente lo que necesitas. 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 solo. La única forma de eliminarlo es mediante el botón de detención forzada junto a la opción de desinstalación en el administrador de aplicaciones. Básicamente usted llama directamente al Servicio. 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 escribe 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 manifiesto:
<service
android:name="TestService"
android:icon="@drawable/ic_launcher"
android:label="TestService"
>
</service>