Форум программистов, компьютерный форум CyberForum.ru

AlarmReceiver - Android

Восстановить пароль Регистрация
 
xbarmaglot
3 / 3 / 0
Регистрация: 06.10.2012
Сообщений: 242
19.01.2014, 09:29     AlarmReceiver #1
C помощью него можно запустить периодические события.
А можно ли как создать события не по таймеру, а в определенное время на каждый день как будильник.
Например каждый день в 17.00.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Netscape
 Аватар для Netscape
371 / 358 / 48
Регистрация: 02.10.2009
Сообщений: 712
Записей в блоге: 4
20.01.2014, 13:59     AlarmReceiver #2
Можно, вот пример.

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
package com.example.scheduleservice;
 
import org.joda.time.DateTime;
import org.joda.time.DateTimeFieldType;
import org.joda.time.Interval;
 
import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
 
public class MainActivity extends Activity {
    // время когда должен срабатывать аларм
    public static final int HOUR = 14, MINUTE = 26, SECONDS = 0;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // юзаю библиотеку jodatime
        // текущее время
        DateTime start = new DateTime();
        // время до старта аларма
        DateTime end = new DateTime(
                start.get(DateTimeFieldType.year()), 
                start.get(DateTimeFieldType.monthOfYear()), 
                start.get(DateTimeFieldType.dayOfMonth()), 
                HOUR, MINUTE, SECONDS);
        // если время уже прошло, переходим на следующий день
        if(!end.isAfterNow()) {
            end = end.plusDays(1);
        }
        // вычисляем разницу времени
        Interval interval = new Interval(start, end);
        start = start.plus(interval.toDurationMillis());
        // аларм будет запускать сервис
        Intent intent = new Intent(this, LoadService.class);
        PendingIntent pendingIntent = PendingIntent.getService(this, 0, intent, 0);
        AlarmManager alarm = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
        
        // Schedule timer
        alarm.setInexactRepeating(AlarmManager.RTC_WAKEUP, 
                start.getMillis(), // сдвиг времени
                24 * 60 * 60 * 1000, // интрвал - сутки
                pendingIntent);
    }
    
}
Также, я добавил себе ресивер получения события RECEIVE_BOOT_COMPLETED, в котором я также вычисляю сдвиг времени и устанавливаю аларм для запуска сервиса.
xbarmaglot
3 / 3 / 0
Регистрация: 06.10.2012
Сообщений: 242
20.01.2014, 14:10  [ТС]     AlarmReceiver #3
Понятно. Спасибо.
А почему используется alarm.setInexactRepeating, а не alarm.setRepeating
Netscape
 Аватар для Netscape
371 / 358 / 48
Регистрация: 02.10.2009
Сообщений: 712
Записей в блоге: 4
20.01.2014, 14:32     AlarmReceiver #4
В документации все написано:
Schedule a repeating alarm that has inexact trigger time requirements; for example, an alarm that repeats every hour, but not necessarily at the top of every hour. These alarms are more power-efficient than the strict recurrences traditionally supplied by setRepeating(int, long, long, PendingIntent), since the system can adjust alarms' delivery times to cause them to fire simultaneously, avoiding waking the device from sleep more than necessary.
These alarms are more power-efficient
для меня это важнее.
Yandex
Объявления
20.01.2014, 14:32     AlarmReceiver
Ответ Создать тему
Опции темы

Текущее время: 22:08. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru