Intereting Posts
Глянцевый градиент с помощью android drawable xml Как загрузить изображение с SD-карты с помощью библиотеки Picasso Ошибка: выполнение выполнено для задачи ': app: transformResourcesWithMergeJavaResForDebug' Аудио продолжает играть после закрытия силы SharedPrefs сбрасывается после настройки локали приложения Android Установка пользовательского агента в Java httpclient и разрешение перенаправления на true Начать настройку в адаптере Как вставить ImageView в конец многострочного TextView? Отпечаток сертификата SHA1 Что я могу сделать, чтобы запретить Android Studio автоматически очищать мой журнал Eclipse + FindBugs – файлы фильтра исключить не работают Как настроить реакцию родной андроидной библиотеки на использование npm, установленную на основе реакции? Использует AsyncTask по-прежнему рекомендуется для загрузки элементов спискаView в фоновом режиме? Запретить другой язык, кроме английского, в EditText Загрузка растрового изображения с помощью Picasso

Как запускать службу каждый день в полдень и при каждой загрузке

В моем приложении у меня есть база данных SQLite, которая имеет одну таблицу с строками даты в миллисекундах. Я хотел бы, чтобы каждый день показывал уведомление, если прошло 30 дней со времени последнего значения даты, хранящегося в моей базе данных. Служба, похоже, является хорошим способом выполнить эту проверку.

Я столкнулся с проблемой WakefulIntentService WakefulIntentService и думал, что это может быть ответ, но я действительно не знаю, как его реализовать. В демо-версии он запускает сервис через 5 минут с момента завершения загрузки, который просто хорош, но что мне нужно добавить, чтобы получить его, также начинаются с каждого полудня. (… но только для того, чтобы показывать одно уведомление / день, а не оба, начиная с загрузки и регулярной ежедневной проверки)

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

благодаря

Solutions Collecting From Web of "Как запускать службу каждый день в полдень и при каждой загрузке"

Android alarmmanager – ваш ответ. Используйте его с широковещательным приемником, который также сбрасывает сигналы тревоги по телефону.

Теперь с примером кода: настройка будильника внутри метода:

 Intent intent = new Intent(context, AlarmReceiver.class); intent.setAction("packagename.ACTION"); PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT); Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(System.currentTimeMillis()); AlarmManager alarm = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); alarm.cancel(pendingIntent); alarm.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent); 

Приемник для вашего интервала:

 public class AlarmReceiver extends BroadcastReceiver { private final String SOMEACTION = "packagename.ACTION"; //packagename is com.whatever.www @Override public void onReceive(Context context, Intent intent) { Time now = new Time(); now.setToNow(); String time = FileHandler.timeFormat(now); String action = intent.getAction(); if(SOMEACTION.equals(action)) { // here you call a service etc. } 

Приемник для сброса аварийных сигналов, когда телефон был отключен.

 public class AlarmSetter extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // get preferences SharedPreferences preferences = context.getSharedPreferences("name_of_your_pref", 0); Map<String, ?> scheduleData = preferences.getAll(); // set the schedule time if(scheduleData.containsKey("fromHour") && scheduleData.containsKey("toHour")) { int fromHour = (Integer) scheduleData.get("fromHour"); int fromMinute = (Integer) scheduleData.get("fromMinute"); int toHour = (Integer) scheduleData.get("toHour"); int toMinute = (Integer) scheduleData.get("toMinute"); //Do some action } } } 

Манифест очень важен, это добавляется в приложении:

  <receiver android:name="AlarmReceiver"> <intent-filter> <action android:name="packagename.ACTION"/> <action android:name="packagename.ACTION2"/> </intent-filter> </receiver> <receiver android:name="AlarmSetter" > <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver> 

Также для этого вам нужно добавить разрешение на получение загрузочной трансляции в манифесте со следующей строкой:

 <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 

Надеюсь, что это прояснилось, если будут какие-то ошибки plz.

Изменить (добавлен пример аварийного сигнала):

 public class AlarmSetter extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // Do your stuff } } 

Этот ответ кажется довольно старым. Теперь я бы полностью рекомендовал людям проверить структуру SyncAdapter, предоставляемую Google. Это обычай для таких вещей. Вот ссылка: https://developer.android.com/training/sync-adapters/index.html

В демо-версии он запускает сервис через 5 минут с момента завершения загрузки, который просто хорош, но что мне нужно добавить, чтобы получить его, также начинаются с каждого полудня.

Измените начальное время setRepeating() . Пример показывает минутку – вам нужно будет выполнить вычисления, чтобы определить, когда следующий полдень.

Вы можете увидеть пример такого рода расчетов в этом OnBootReceiver из другого образца проекта. Здесь я настраиваю будильник, чтобы каждый день выходить в указанное пользователем время.