Utilice alarmManager y el servicio para realizar la notificación de planificación sólo durante un período de tiempo específico
Estoy creando una aplicación que activará notificaciones en intervalos de tiempo específicos durante las horas de vigilia de los usuarios.
Tengo un alarmManager que funciona dentro de un servicio. El servicio se inicia explícitamente a través de un botón de clic en la actividad principal y tiene el alarmManager ejecutando notificaciones durante los inversores de tiempo específicos. ¿Cómo haría para detener las notificaciones durante ciertas horas del día? No quiero que se disparen estas notificaciones, por ejemplo, mientras el usuario está durmiendo.
- Android AlarmManager: ¿hay una manera de cancelar TODAS las alarmas fijadas?
- ¿Hay alguna forma de comprobar si ya está configurada una alarma?
- ¿Cuál es la definición de dormido para un dispositivo Android?
- Android cancelar todos los alarmmanager
- Alarma programada para repetir cada minuto del reloj android
Mi código que está actualmente disparando notificaciones a intervalos definidos por el usuario está por debajo (las importaciones eliminadas … esto ya es suficiente):
public class FartSmackinChunks extends Service { public Notification scheduleNotification; public AlarmManager alarmScheduleManager; public PendingIntent alarmScheduleIntent; private Boolean autoUpdateBoolean = true; private int intervalsGoneByInt = 0; private Notification notification; public static final int NOTIFICATION_ID = 1; @Override public void onCreate() { // TODO: Actions to perform when service is created. int icon = R.drawable.icon; String tickerText = "INTERVAL FIRED"; long when = System.currentTimeMillis(); scheduleNotification = new Notification(icon, tickerText, when); alarmScheduleManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE); String ALARM_ACTION; ALARM_ACTION = ScheduleAlarmReceiver.ACTION_REFRESH_SCHEDULE_ALARM; Intent intentToFire = new Intent(ALARM_ACTION); alarmScheduleIntent = PendingIntent.getBroadcast(this, 0, intentToFire, 0); } @Override public int onStartCommand(Intent intent, int flags, int startId) { SharedPreferences mySharedPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); boolean autoUpdateBoolean = mySharedPreferences.getBoolean("storedAutoUpdateBoolean", false); String updateFreq = mySharedPreferences.getString("storedInitialAverageTimeInterval", "00:00:00"); SimpleDateFormat dfInterval = new SimpleDateFormat("hh:mm:ss"); Date intervalTimeAsDateObject = null; long updateFreqMilliLong; try { intervalTimeAsDateObject = dfInterval.parse(updateFreq); } catch (ParseException e) { e.printStackTrace(); } updateFreqMilliLong = intervalTimeAsDateObject.getTime() - 18000000; if (autoUpdateBoolean) { int alarmType = AlarmManager.ELAPSED_REALTIME_WAKEUP; long timetoRefresh = SystemClock.elapsedRealtime() + updateFreqMilliLong; alarmScheduleManager.setInexactRepeating(alarmType, timetoRefresh, updateFreqMilliLong, alarmScheduleIntent); notifications(); } else alarmScheduleManager.cancel(alarmScheduleIntent); return Service.START_NOT_STICKY; }; private void notifications() { **notification stuff in here*** } @Override public IBinder onBind(Intent intent) { // TODO: Replace with service binding implementation. return null; } @Override public void onDestroy() { this.alarmScheduleManager.cancel(alarmScheduleIntent); } }
….. y mi implementación de receptor de difusión aquí:
import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; public class ScheduleAlarmReceiver extends BroadcastReceiver { public static final String ACTION_REFRESH_SCHEDULE_ALARM = "com.application.ACTION_REFRESH_SCHEDULE_ALARM"; @Override public void onReceive(Context context, Intent intent) { Intent startIntent = new Intent(context, SmokerReducerService.class); context.startService(startIntent); } }
Estoy teniendo un poco de dificultad envolviendo mi cerebro sobre cómo esto debe ser implementado.
Yo estaba pensando en volver a trabajar este código para que el alarmManager se disparó a la hora de vigilia y se detuvo en sleepTime, todo mientras dentro del servicio es un temporizador que dispara el método de notificación en intervalos específicos? ¿Hay una mejor manera de hacer esto?
Cualquier entrada sería apreciada. He estado tratando de resolver esto en mi cabeza durante días.
Gracias
EDIT: @ alguien que viene a través de esta intención de utilizar un temporizador para las notificaciones diarias:
Un temporizador que se ejecuta dentro de un servicio será detenido por el tiempo de ejecución cuando el dispositivo se pone en suspensión (es decir … el usuario pone el teléfono en modo de espera). Por lo tanto, usar un temporizador para disparar notificaciones a intervalos de tiempo específicos no funcionará correctamente en un servicio porque cuando Android hace una pausa en el servicio, también hace una pausa en el temporizador, lo que desactiva el intervalo.
La forma correcta de hacerlo es usar AlarmManager con una matriz de intentos pendientes para establecer alarmas en momentos específicos durante el día. Esto asegura que incluso si el teléfono se pone en espera, las notificaciones (o lo que quieras que suceda en ese momento) todavía se ejecutará.
- Android AlarmManager no despertar teléfono hasta
- Ejemplo del Administrador de alarmas
- Android AlarmManager setRepeating no se repite con un intervalo largo
- ¿Cómo se inicia una Actividad con AlarmManager en Android?
- La alarma se borra al reiniciar en nadroid
- IntentService no comenzará a usar AlarmManager
- android configurar múltiples alarmas simultaneosuly
- ¿Qué sucede cuando inicio una alarma dos veces?
Yo estaba pensando en volver a trabajar este código para que el alarmManager se disparó a la hora de vigilia y se detuvo en sleepTime, todo mientras dentro del servicio es un temporizador que dispara el método de notificación en intervalos específicos? ¿Hay una mejor manera de hacer esto?
A mi mente, olvidarse de pensar en una "mejor" manera, parece ser la única manera. Utilizar un temporizador para controlar (activar / desactivar) otro temporizador no es tan extraño y tiene sentido para mí.
- Los recursos no utilizados de la capa de androide del módulo de la biblioteca se utilizan en la aplicación
- Cómo aumentar el tamaño de transport.dump de 256 bytes a 512 o más bytes en KSOAP2?