Используйте alarmManager и службу для выполнения уведомления по расписанию только в течение определенного периода времени

Я создаю приложение, которое будет запускать уведомления через определенные промежутки времени в часы бодрствования пользователей.

У меня есть AlarmManager, работающий внутри службы. Служба запускается явным образом нажатием кнопки на основном действии и имеет AlarmManager, выполняющий уведомления в определенные интервалы времени. Как мне отключить уведомления в определенные часы дня? Я не хочу, чтобы это уведомление запускалось, например, когда пользователь спит.

Мой код, который в настоящее время запускает уведомления с заданными пользователем интервалами, приведен ниже (импорт удален .... этого уже достаточно):

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);
    }
}

..... и моя реализация широковещательного приемника здесь:

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);
    }
}

I Мне трудно понять, как это должно быть реализовано.

Я думал переделать этот код, чтобы AlarmManager запускался во время пробуждения и останавливался во время сна, а внутри службы был таймер, который запускал метод уведомления через определенные промежутки времени? Есть ли лучший способ сделать это?

Любой вклад будет признателен. Я уже несколько дней пытаюсь придумать это в своей голове.

Спасибо

EDIT:

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);
    }
}

Мне трудно понять, как это следует реализовать.

Я думал переделать этот код, чтобы AlarmManager запускался во время пробуждения и останавливался во время сна, а внутри службы был таймер, который запускал метод уведомления через определенные промежутки времени? Есть ли лучший способ сделать это?

Любой вклад будет признателен. Я уже несколько дней пытаюсь придумать это в своей голове.

Спасибо

EDIT:

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);
    }
}

Мне трудно понять, как это следует реализовать.

Я думал переделать этот код, чтобы AlarmManager запускался во время пробуждения и останавливался во время сна, а внутри службы был таймер, который запускал метод уведомления через определенные промежутки времени? Есть ли лучший способ сделать это?

Любой вклад будет признателен. Я уже несколько дней пытаюсь придумать это в своей голове.

Спасибо

EDIT: а внутри службы есть таймер, который запускает метод уведомления через определенные промежутки времени? Есть ли лучший способ сделать это?

Любой вклад будет признателен. Я уже несколько дней пытаюсь придумать это в своей голове.

Спасибо

EDIT: а внутри службы есть таймер, который запускает метод уведомления через определенные промежутки времени? Есть ли лучший способ сделать это?

Любой вклад будет признателен. Я уже несколько дней пытаюсь придумать это в своей голове.

Спасибо

EDIT: @ любой, кто сталкивается с этим, намеревается использовать таймер для ежедневных уведомлений:

Таймер, который работает внутри службы, будет приостановлен средой выполнения, когда устройство переведено в спящий режим (т. е. ... пользователь помещает телефон в ожидать). Таким образом, использование таймера для отправки уведомлений через определенные промежутки времени не будет работать правильно в рамках службы, потому что, когда Android приостанавливает службу, он также приостанавливает таймер, который сбрасывает интервал.

Правильный способ сделать это - используйте AlarmManager с массивом ожидающих намерений для установки сигналов тревоги в определенное время в течение дня. Это гарантирует, что даже если телефон переведен в режим ожидания, уведомления (или все, что вы хотите сделать в это время) все равно будут выполняться.

11
задан Mr_and_Mrs_D 16 March 2013 в 18:09
поделиться