Страницы

Поиск по вопросам

Показаны сообщения с ярлыком android-alarm-manager. Показать все сообщения
Показаны сообщения с ярлыком android-alarm-manager. Показать все сообщения

пятница, 13 марта 2020 г.

AlarmReceiver, WakefulBroadcastReceiver и установка будильников

#android #android_sdk #broadcast_receiver #android_alarm_manager #android_broadcastreceiver


Здравствуйте! Подобный вопрос уже был от меня, но ответа, который решил бы мою проблему
на него не получил. Наверное, не стоит писать здесь свой код, так как скорее всего,
я выбрал неверный подход к решению задачи. Тем не менее, оставлю ссылку на свой предыдущий
вопрос: тут мой вопрос.

Подскажите, пожалуйста, как реализовать следующую задачу:
Есть таблица в БД, в которой находятся записи.
Колонки в таблице:
[ID][NAME][DAY][HOURS][MINUTES]

Также есть Активити, которую нужно вызывать в заданное время.

То есть, нужно сканировать таблицу в БД, и на основе этих данных нужно установить
Alarm-ы, которые будут вызывать Активити.

Содержимое Активити менять не нужно (оно будет менятся уже в onCreate()  самой Активити).

Проблема в том, что я не понимаю, как поставить alarm-ы в множественном числе. Опять-таки,
по ссылке, приведённой выше, я показал своё виденье реализации задачи.

Заранее спасибо за ответы, очень надеюсь на Вашу помощь, ибо без решения этой задачи
не могу двигаться дальше :( 
    


Ответы

Ответ 1



Попробуйте в Вашем коде заменить на это: AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); Intent intent = new Intent(context, AlarmReceiver.class); intent.putExtra("alarm message", "alarm message"); if (android.os.Build.VERSION.SDK_INT >= 19) { am.setInexactRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), AlarmManager.INTERVAL_DAY, sender); } else { am.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), AlarmManager.INTERVAL_DAY, sender); } PendingIntent sender = PendingIntent.getBroadcast(context, i, intent, PendingIntent.FLAG_UPDATE_CURRENT); Просто для разных версий андроида регистрация pendingIntent-a происходит по-разному. Плюс, вы всегда регистрировали его под номером 192837, я заменил его на i, так как эта переменная используется в цикле, и она будет уникальная, и каждый последующий pendingIntent не будет перезаписывать предыдущий. Если есть необходимость удалить все зарегестрированные интенты, то вызовите такую функцию: public static void clearAlarmReceiver(Context context, int intentsCount) { for (int i = 0; i < intentsCount; i++) { Intent intent = new Intent(context, CheckAlarmReceiver.class); PendingIntent pendingIntent = PendingIntent.getBroadcast(context, i, intent, 0); AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); alarmManager.cancel(pendingIntent); pendingIntent.cancel(); } }

суббота, 8 февраля 2020 г.

Уведомления в Android в заданное время

#java #android #notifications #android_notification #android_alarm_manager


Пользователь создает себе задачи и выставляет время, когда ему напомнить о них. (Например:
Напомнить за 15 минут, час, день и т.д.).

Как это реализовать?
    


Ответы

Ответ 1



Для выбора реализации можно воспользоваться этой диаграммой

Ответ 2



AlarmManager manager = (AlarmManager)getSystemService(Context.ALARM_SERVICE); Там настолько свободный полет, что только вам будет правильно реализовывать процесс. И куча примеров, как написано выше Поиск в Google

вторник, 31 декабря 2019 г.

Как реализовать циклический вызов метода раз в 10 минут?

#java #android #android_service #android_alarm_manager


Вопрос относительно Service: пытаюсь реализовать процесс, который должен запускаться
раз в 10 минут. Создал для этого отдельный метод. Прописал Cлужбу в AndroidManifest.xml,
создал отдельный класс для Service. На данный момент Cлужба выполняется при запуске
приложения и продолжает работать после завершения работы приложения. Но сейчас этот
процесс запускается единожды. Метод выполняется в отдельном Thread'e в onStartCommand().
То есть сама Cлужба работает как надо, но вот выполнение метода нужно поставить в бесконечный
цикл (с периодичностью 10 минут) до тех пор, пока в приложении пользователь не остановит
Cлужбу.

Было бы здорово, если бы кто-то привел пример реализации запуска метода с периодичностью
в 10 минут.
    


Ответы

Ответ 1



Вам не нужен в данном случае сервис. Вам нужен AlarmManager public static void setAlarm(Context ctx) { AlarmManager am = (AlarmManager) ctx.getApplicationContext().getSystemService(Context.ALARM_SERVICE); Intent intentToTimerReceiver = new Intent(ctx.getApplicationContext(), ReceiverTimer.class); intentToTimerReceiver.setAction("someAction"); PendingIntent pendingIntent = PendingIntent.getBroadcast( ctx.getApplicationContext(), 0, intentToTimerReceiver, PendingIntent.FLAG_CANCEL_CURRENT); int period10Minutes = 10; long periodInMiliseconds = periodInMinutes * 60 * 1000; if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { am.setInexactRepeating(AlarmManager.RTC_WAKEUP, periodInMiliseconds, periodInMiliseconds, pendingIntent); } else { am.setRepeating(AlarmManager.RTC_WAKEUP, periodInMiliseconds, periodInMiliseconds, pendingIntent); } } private static void cancelAlarm(Context ctx) { Log.i(TAG, "cancelAlarm"); AlarmManager am = (AlarmManager) ctx.getApplicationContext().getSystemService(Context.ALARM_SERVICE); Intent intentToTimerReceiver = new Intent(ctx.getApplicationContext(), ReceiverTimer.class); intentToTimerReceiver.setAction("someAction"); PendingIntent pendingIntent = PendingIntent.getBroadcast(ctx.getApplicationContext(), 0, intentToTimerReceiver, PendingIntent.FLAG_CANCEL_CURRENT); am.cancel(pendingIntent); pendingIntent.cancel(); } После его установки будет вызван описанный в ресивере и в отдельном классе ReceiverTimer, в коем вам и надо выполнять ваш периодический код Ресивер: public class ReceiverTimer extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Log.d(LOG, "onReceive " + intent.getAction()); } } Манифест:

Ответ 2



С той ж целью можно использовать Timer: import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import java.util.Timer; import java.util.TimerTask; public class MyActivity extends AppCompatActivity { Timer mTimer; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my); mTimer = new Timer(); startAlarm(); } private void startAlarm() { mTimer.scheduleAtFixedRate(new TimerTask() { @Override public void run() { //Тут отработка метода в отдельном потоке; runOnUiThread(new Runnable() { @Override public void run() { //Тут выход в UI если нужно; } }); } } , 0 // Это задержка старта, сейчас 0; , 600000); // Это Ваш период в 10 минут; } private void cancelTimer() { if (mTimer != null) { mTimer.cancel(); mTimer = null; } } }

пятница, 31 мая 2019 г.

AlarmReceiver, WakefulBroadcastReceiver и установка будильников

Здравствуйте! Подобный вопрос уже был от меня, но ответа, который решил бы мою проблему на него не получил. Наверное, не стоит писать здесь свой код, так как скорее всего, я выбрал неверный подход к решению задачи. Тем не менее, оставлю ссылку на свой предыдущий вопрос: тут мой вопрос
Подскажите, пожалуйста, как реализовать следующую задачу: Есть таблица в БД, в которой находятся записи. Колонки в таблице: [ID][NAME][DAY][HOURS][MINUTES]
Также есть Активити, которую нужно вызывать в заданное время.
То есть, нужно сканировать таблицу в БД, и на основе этих данных нужно установить Alarm-ы, которые будут вызывать Активити.
Содержимое Активити менять не нужно (оно будет менятся уже в onCreate() самой Активити).
Проблема в том, что я не понимаю, как поставить alarm-ы в множественном числе. Опять-таки, по ссылке, приведённой выше, я показал своё виденье реализации задачи.
Заранее спасибо за ответы, очень надеюсь на Вашу помощь, ибо без решения этой задачи не могу двигаться дальше :(


Ответ

Попробуйте в Вашем коде заменить на это:
AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); Intent intent = new Intent(context, AlarmReceiver.class); intent.putExtra("alarm message", "alarm message"); if (android.os.Build.VERSION.SDK_INT >= 19) { am.setInexactRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), AlarmManager.INTERVAL_DAY, sender); } else { am.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), AlarmManager.INTERVAL_DAY, sender); } PendingIntent sender = PendingIntent.getBroadcast(context, i, intent, PendingIntent.FLAG_UPDATE_CURRENT);
Просто для разных версий андроида регистрация pendingIntent-a происходит по-разному. Плюс, вы всегда регистрировали его под номером 192837, я заменил его на i, так как эта переменная используется в цикле, и она будет уникальная, и каждый последующий pendingIntent не будет перезаписывать предыдущий.
Если есть необходимость удалить все зарегестрированные интенты, то вызовите такую функцию:
public static void clearAlarmReceiver(Context context, int intentsCount) { for (int i = 0; i < intentsCount; i++) { Intent intent = new Intent(context, CheckAlarmReceiver.class); PendingIntent pendingIntent = PendingIntent.getBroadcast(context, i, intent, 0); AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); alarmManager.cancel(pendingIntent); pendingIntent.cancel(); } }

пятница, 12 апреля 2019 г.

Уведомления в Android в заданное время

Пользователь создает себе задачи и выставляет время, когда ему напомнить о них. (Например: Напомнить за 15 минут, час, день и т.д.).
Как это реализовать?


Ответ

Для выбора реализации можно воспользоваться этой диаграммой

вторник, 25 декабря 2018 г.

Как реализовать циклический вызов метода раз в 10 минут?

Вопрос относительно Service: пытаюсь реализовать процесс, который должен запускаться раз в 10 минут. Создал для этого отдельный метод. Прописал Cлужбу в AndroidManifest.xml, создал отдельный класс для Service. На данный момент Cлужба выполняется при запуске приложения и продолжает работать после завершения работы приложения. Но сейчас этот процесс запускается единожды. Метод выполняется в отдельном Thread'e в onStartCommand(). То есть сама Cлужба работает как надо, но вот выполнение метода нужно поставить в бесконечный цикл (с периодичностью 10 минут) до тех пор, пока в приложении пользователь не остановит Cлужбу
Было бы здорово, если бы кто-то привел пример реализации запуска метода с периодичностью в 10 минут.


Ответ

Вам не нужен в данном случае сервис. Вам нужен AlarmManager
public static void setAlarm(Context ctx) { AlarmManager am = (AlarmManager) ctx.getApplicationContext().getSystemService(Context.ALARM_SERVICE); Intent intentToTimerReceiver = new Intent(ctx.getApplicationContext(), ReceiverTimer.class); intentToTimerReceiver.setAction("someAction");
PendingIntent pendingIntent = PendingIntent.getBroadcast( ctx.getApplicationContext(), 0, intentToTimerReceiver, PendingIntent.FLAG_CANCEL_CURRENT);
int period10Minutes = 10; long periodInMiliseconds = periodInMinutes * 60 * 1000; if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { am.setInexactRepeating(AlarmManager.RTC_WAKEUP, periodInMiliseconds, periodInMiliseconds, pendingIntent); } else { am.setRepeating(AlarmManager.RTC_WAKEUP, periodInMiliseconds, periodInMiliseconds, pendingIntent); } }
private static void cancelAlarm(Context ctx) { Log.i(TAG, "cancelAlarm"); AlarmManager am = (AlarmManager) ctx.getApplicationContext().getSystemService(Context.ALARM_SERVICE); Intent intentToTimerReceiver = new Intent(ctx.getApplicationContext(), ReceiverTimer.class); intentToTimerReceiver.setAction("someAction"); PendingIntent pendingIntent = PendingIntent.getBroadcast(ctx.getApplicationContext(), 0, intentToTimerReceiver, PendingIntent.FLAG_CANCEL_CURRENT);
am.cancel(pendingIntent); pendingIntent.cancel(); }
После его установки будет вызван описанный в ресивере и в отдельном классе ReceiverTimer, в коем вам и надо выполнять ваш периодический код
Ресивер:
public class ReceiverTimer extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Log.d(LOG, "onReceive " + intent.getAction()); } }
Манифест: