Гость
Форумы / Android [игнор отключен] [закрыт для гостей] / Запуск функции ежедневно / 25 сообщений из 31, страница 1 из 2
07.06.2015, 12:25
    #38978374
korshun
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск функции ежедневно
Сорри за такую дурацкую тему, но что-то залип немного :(
Требуется раз в месяц, в определенный день и час запускать функцию. Сделал сервис, сделал таймер, но в итоге конструкция работает как-то криво: запускается в нужный день, но не единожды, как задумывается, а несколько раз с разными промежутками между запусками.

Как делаю:


1. В onCreate инициализирую таймер, задаю параметры и запускаю планировщик.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
    @Override
    public void onCreate() {
        super.onCreate();

        alertSendDataTimer =                          new Timer();


        // ------------
        Calendar alertTime = Calendar.getInstance();

        alertTime.set(Calendar.DAY_OF_MONTH, 24);
        alertTime.set(Calendar.HOUR_OF_DAY, 14);
        alertTime.set(Calendar.MINUTE, 0);
        alertTime.set(Calendar.SECOND, 0);


        TimerTask alertSendDataTask =                   new TimerTask () {
            @Override
            public void run () {
                alertSendData(CheckNewDataService.this);
            }
        };
        alertSendDataTimer.schedule(alertSendDataTask, alertTime.getTime(), TimeUnit.MILLISECONDS.convert(1, TimeUnit.DAYS));
}



2. В onDestroy соответственно все отменяю
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
    @Override
    public void onDestroy() {

        alertSendDataTimer.cancel();

        super.onDestroy();

    }



Что не так делаю ? Такое ощущение, что при уничтожении сервиса и его последующем создании каждый раз создается новый таймер, а старый не удаляется.
И правильно ли вообще задача реализуется, может есть более правильные методы ? Заранее спасибо!
...
Рейтинг: 0 / 0
07.06.2015, 15:09
    #38978439
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск функции ежедневно
Почему не сервисом делаешь? Он может работать отдельно от приложения.
...
Рейтинг: 0 / 0
07.06.2015, 15:43
    #38978447
korshun
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск функции ежедневно
Именно сервисом и делаю.
...
Рейтинг: 0 / 0
07.06.2015, 16:02
    #38978452
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск функции ежедневно
А в коде таймер...
...
Рейтинг: 0 / 0
07.06.2015, 16:06
    #38978454
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск функции ежедневно
Поищи здесь по слову будильник.
...
Рейтинг: 0 / 0
07.06.2015, 16:33
    #38978464
korshun
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск функции ежедневно
Спасибо, что натолкнули в нужном направлении.
https://developer.android.com/intl/ru/training/scheduling/alarms.html - для тех, кто будет так же тупить, как и я))
...
Рейтинг: 0 / 0
08.06.2015, 18:49
    #38979512
korshun
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск функции ежедневно
Еще пара вопросов.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
    private void createSendDataAlarm(AlarmManager alarmManager, PendingIntent pendingIntent, int day) {

        Calendar calendar =                                 Calendar.getInstance();

        calendar.setTimeInMillis(System.currentTimeMillis());
        calendar.set(Calendar.DAY_OF_MONTH, day);
        calendar.set(Calendar.HOUR_OF_DAY, 20);
        calendar.set(Calendar.MINUTE, 30);
        calendar.set(Calendar.SECOND, 0);

        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
            alarmManager.setExact(
                    AlarmManager.RTC_WAKEUP,
                    calendar.getTimeInMillis(),
                    pendingIntent);
        }
        else {
            alarmManager.setInexactRepeating(
                    AlarmManager.RTC_WAKEUP,
                    calendar.getTimeInMillis(),
                    AlarmManager.INTERVAL_DAY,
                    pendingIntent);
        }
        
    }


Планирую на выполнение задачу один раз в месяц.
Все работает, но непонятен один момент: если текущее время больше того, которое запланировано, задача сразу же срабатывает. Мне же нужно, что бы сработка была только раз, как это сделать ?

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
    private void createNewDataAlarm(AlarmManager alarmManager, PendingIntent pendingIntent) {
        Calendar calendar =                                 Calendar.getInstance();

        calendar.setTimeInMillis(System.currentTimeMillis());
        calendar.set(Calendar.SECOND, 30);

        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
            alarmManager.setWindow(
                    AlarmManager.RTC_WAKEUP,
                    System.currentTimeMillis(),
                    Config.TIMER_PERIOD_CHECK_NEW_DATA * 1000,
                    pendingIntent);
        }
        else {
            alarmManager.setInexactRepeating(
                    AlarmManager.RTC_WAKEUP,
                    System.currentTimeMillis(),
                    Config.TIMER_PERIOD_CHECK_NEW_DATA * 1000,
                    pendingIntent);
        }
    }


А тут пытаюсь сделать задачу, которая повторялась бы через равные промежутки времени, но почему-то setWindow срабатывает только раз. Что тут не так делаю ?
...
Рейтинг: 0 / 0
08.06.2015, 19:42
    #38979544
korshun
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск функции ежедневно
C повторением разобрался, невнимательно читал документацию :(
Первый вопрос еще актуален.
...
Рейтинг: 0 / 0
09.06.2015, 09:12
    #38979740
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск функции ежедневно
korshunПервый вопрос еще актуален.
Этот?
korshunМне же нужно, что бы сработка была только раз, как это сделать ?
Дак ведь проще простого: проверяй, сколько сейчас времени и какое число, прежде, чем планировать дату/время выполнения.
...
Рейтинг: 0 / 0
09.06.2015, 10:32
    #38979830
korshun
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск функции ежедневно
Да так и сделал уже :)
Только оно как-то через раз работает.
Дебаггер показывает точку входа в блок, планирование значит выполняется, а подходит нужное время - тишина.
Создается впечатление, что это может быть связано с перезапуском сервиса. Вставил в onDestroy System.out.println("CheckNewDataService onDestroy"); - убил сервис, в итоге в консоли:

Код: java
1.
2.
3.
4.
06-09 12:25:30.570  10593-10593/ru.korshun.mytavatuymobile I/System.out﹕ CheckNewDataService onCreate
06-09 12:25:30.590  10593-10593/ru.korshun.mytavatuymobile I/System.out﹕ CheckNewDataService onStartCommand
06-09 12:25:57.920    2348-2360/system_process W/ActivityManager﹕ Scheduling restart of crashed service ru.korshun.mytavatuymobile/.CheckNewDataService in 40937ms
06-09 12:25:57.920    2348-2360/system_process I/ActivityManager﹕ Force stopping service ServiceRecord{42f223f0 u0 ru.korshun.mytavatuymobile/.CheckNewDataService}



В итоге прошло уже гораздо больше 40937ms, а сервис так и не стартовал :(
Это что, очередная "особенность" android kitkat ? :(
...
Рейтинг: 0 / 0
09.06.2015, 12:17
    #38980023
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск функции ежедневно
...
Рейтинг: 0 / 0
09.06.2015, 12:33
    #38980047
korshun
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск функции ежедневно
Не вызывается у меня onDestroy()
Вообще.
Android 4.4.4
...
Рейтинг: 0 / 0
09.06.2015, 12:47
    #38980069
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск функции ежедневно
korshunНе вызывается у меня onDestroy()
А где смотришь? Пуляешь в одно место, а смотришь в логкате? В логкат пишут с помощью класса Log.*
...
Рейтинг: 0 / 0
09.06.2015, 13:01
    #38980082
korshun
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск функции ежедневно
Знаю :)
С помощью Log.d() выводится ровным счетом то же самое :)

Код: java
1.
2.
3.
4.
06-09 14:56:53.190  15449-15449/ru.korshun.mytavatuymobile D/myLog﹕ CheckNewDataService onCreate
06-09 14:56:53.195  15449-15449/ru.korshun.mytavatuymobile D/myLog﹕ CheckNewDataService onStartCommand
06-09 14:57:08.530  15743-15743/ru.korshun.mytavatuymobile D/myLog﹕ CheckNewDataService onCreate
06-09 14:57:08.535  15743-15743/ru.korshun.mytavatuymobile D/myLog﹕ CheckNewDataService onStartCommand
...
Рейтинг: 0 / 0
09.06.2015, 13:22
    #38980114
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск функции ежедневно
korshun
Код: java
1.
Force stopping service ServiceRecord


Эта строка о чем говорит? Что закрываешь приложение средствами андроида?
...
Рейтинг: 0 / 0
09.06.2015, 13:32
    #38980122
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск функции ежедневно
По ссылке кстати в коде сервис, а у тебя тут не сервис.
Добавь сервис, которым контролируй свои будильники.
...
Рейтинг: 0 / 0
09.06.2015, 14:08
    #38980159
korshun
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск функции ежедневно
wadmankorshun
Код: java
1.
Force stopping service ServiceRecord


Эта строка о чем говорит? Что закрываешь приложение средствами андроида?
Вылазит после того, как вручную очищаю память.

wadmanПо ссылке кстати в коде сервис, а у тебя тут не сервис.
Добавь сервис, которым контролируй свои будильники.
В смысле "у тебя не сервис", это тогда что такое ?


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
public class CheckNewDataService
        extends Service {

    private AlarmManager alarmSendDataManager;
    private PendingIntent alarmSendDataPendingIntent;

    public static final int CHECK_NEW_DATA =                1;
    public static final int CHECK_SEND_DATA =               2;

    @Override
    public void onCreate() {
        Log.d("myLog", "CheckNewDataService onCreate");
        super.onCreate();
        alarmSendDataManager =                              (AlarmManager) getSystemService(Context.ALARM_SERVICE);



        if(
            Calendar.getInstance().get(Calendar.DAY_OF_MONTH) <= Config.LAST_DATA_SEND_DAY &&
            Calendar.getInstance().get(Calendar.HOUR_OF_DAY) < Config.LAST_DATA_SEND_HOUR
          ) {
            Intent sendDataIntent =                         new Intent(this, AlarmReceiver.class);
            sendDataIntent.putExtra("type",                 CHECK_SEND_DATA);

            alarmSendDataPendingIntent =                    PendingIntent.getBroadcast(this, CHECK_SEND_DATA, sendDataIntent, PendingIntent.FLAG_UPDATE_CURRENT);

            createSendDataAlarm(alarmSendDataManager, alarmSendDataPendingIntent, Config.LAST_DATA_SEND_DAY);
        }


        Intent newDataIntent =                              new Intent(this, AlarmReceiver.class);
        newDataIntent.putExtra("type",                      CHECK_NEW_DATA);

        alarmNewDataPendingIntent =                         PendingIntent.getBroadcast(this, CHECK_NEW_DATA, newDataIntent, PendingIntent.FLAG_UPDATE_CURRENT);

        createNewDataAlarm(alarmSendDataManager, alarmNewDataPendingIntent);

    }



    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d("myLog", "CheckNewDataService onStartCommand");

        return START_STICKY;
    }



    @Override
    public void onDestroy() {
        super.onDestroy();

        Log.d("myLog", "CheckNewDataService onDestroy");
        cancelAlarm(alarmSendDataManager, alarmSendDataPendingIntent);
        cancelAlarm(alarmSendDataManager, alarmNewDataPendingIntent);


    }



    @Override
    public void onTaskRemoved(Intent rootIntent) {
        Log.d("myLog", "CheckNewDataService onTaskRemoved");
    }



    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }


...
Рейтинг: 0 / 0
09.06.2015, 14:21
    #38980167
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск функции ежедневно
А про флаги всё прочитал? Там есть кое-что интересное: http://developer.android.com/intl/ru/reference/android/app/Service.html#START_REDELIVER_INTENT

авторConstant to return from onStartCommand(Intent, int, int): if this service's process is killed while it is started (after returning from onStartCommand(Intent, int, int)), then it will be scheduled for a restart and the last delivered Intent re-delivered to it again via onStartCommand(Intent, int, int). This Intent will remain scheduled for redelivery until the service calls stopSelf(int) with the start ID provided to onStartCommand(Intent, int, int). The service will not receive a onStartCommand(Intent, int, int) call with a null Intent because it will will only be re-started if it is not finished processing all Intents sent to it (and any such pending events will be delivered at the point of restart).

Constant Value: 3 (0x00000003)
...
Рейтинг: 0 / 0
10.06.2015, 07:20
    #38980659
korshun
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск функции ежедневно
Да читал и даже пробовал - результат такой же :(
Интернеты пишут, что это баг kitkat'a.
Одно не понятно - почему у меня ondestroy в принципе не срабатывает.
...
Рейтинг: 0 / 0
10.06.2015, 08:53
    #38980695
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск функции ежедневно
korshunИнтернеты пишут, что это баг kitkat'a.
Врут поди... Проверь: wadman.ru/apk/srvtest.apk
...
Рейтинг: 0 / 0
10.06.2015, 09:35
    #38980743
korshun
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск функции ежедневно
Да тоже самое :(
Сервис схлопывается, когда телефон уходит в спячку и с концами.
...
Рейтинг: 0 / 0
10.06.2015, 09:41
    #38980749
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск функции ежедневно
korshunДа тоже самое :(
Про спячку речи не было. Что происходит, когда останавливаешь его стопом?
...
Рейтинг: 0 / 0
10.06.2015, 10:04
    #38980795
korshun
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск функции ежедневно
Абсолютно то же самое, что и в случае с моим приложением - процесс пропадает и больше не стартует.
...
Рейтинг: 0 / 0
10.06.2015, 10:06
    #38980797
korshun
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск функции ежедневно
Нашел видео:
YouTube Video
...
Рейтинг: 0 / 0
10.06.2015, 10:22
    #38980818
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск функции ежедневно
korshun, у меня на телефона 4.4.2 и баг повторяется, а уже в эмуляторе 4.4.4 - все нормально работает.

Но! Ватсап как-то умудряется нормально работать, его видимо гугловские пуш сервисы инициализируют. А их фиг убьешь, они умеют пользоваться скрытым айпи. Погугли на тему скрытого айпи, я как-то его выдергивал из своего смарта. Там много интересного.
...
Рейтинг: 0 / 0
Форумы / Android [игнор отключен] [закрыт для гостей] / Запуск функции ежедневно / 25 сообщений из 31, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]