Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.81/21: Рейтинг темы: голосов - 21, средняя оценка - 4.81
25 / 8 / 2
Регистрация: 14.12.2009
Сообщений: 281

AlarmManager несколько расписаний

30.10.2014, 15:02. Показов 4041. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток. Помогите разобраться. Делаю вывод напоминаний по расписанию с помощью AlarmManager. Пользователь должен имеет возможность настраивать до 14-ти напоминаний (по 2 на каждый день недели). Одно напоминание получилось реализовать, но 2 и более - уже не работают. Что я делаю не так?
С 2-мя календарями(14:30 и 14:31) - напоминание появляется только в 14:31, и каждый раз когда заходишь в приложение(тоже не пойму почему).

MainActivity.java
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
        Calendar calendar1 = Calendar.getInstance();
    Calendar calendar2 = Calendar.getInstance();
    
    AlarmManager alarmManager;
    calendar1.set(Calendar.DAY_OF_WEEK, 5);//с воскресенья отсчёт 
    calendar1.set(Calendar.HOUR_OF_DAY, 14);
    calendar1.set(Calendar.MINUTE, 30);
    calendar1.set(Calendar.SECOND, 0);
    
    calendar2.set(Calendar.DAY_OF_WEEK, 5);//с воскресенья отсчёт 
    calendar2.set(Calendar.HOUR_OF_DAY, 14);
    calendar2.set(Calendar.MINUTE, 31);
    calendar2.set(Calendar.SECOND, 0);
    
    Intent myIntent = new Intent(MainActivity.this, MyReceiver.class);
    pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 0, myIntent,0);
    
    alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
    alarmManager.set(AlarmManager.RTC, calendar1.getTimeInMillis(), pendingIntent); 
    alarmManager.set(AlarmManager.RTC, calendar2.getTimeInMillis(), pendingIntent);
MyReceiver.java
Java
1
2
3
4
5
6
7
8
9
public class MyReceiver extends BroadcastReceiver
{      
    @Override
    public void onReceive(Context context, Intent intent)
    {
       Intent service1 = new Intent(context, MyAlarmService.class);
       context.startService(service1);        
    }   
}
С 2-мя календарями(14:30 и 14:31) - напоминание появляется только в 14:31, и каждый раз когда заходишь в приложение(тоже не пойму почему).
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.10.2014, 15:02
Ответы с готовыми решениями:

Визуализация расписаний
Нужна помощь: http://s018.***********/i527/1406/4e/1dfec782cec1.jpg прога, строит графы, расписания ...

Составитель расписаний
Всем привет! Помогите с прогой. Надо сделать так что бы каждая дата имела свои данные времени, предметов и аудиторий, чтоб выбирая 17 чисто...

Составление расписаний
Всем привет. Есть следующая задача, которую я не понимаю как решать: Необходимо найти минимальное время завершения выполнения...

9
 Аватар для Netscape
374 / 361 / 52
Регистрация: 02.10.2009
Сообщений: 712
Записей в блоге: 4
30.10.2014, 15:05
Лучший ответ Сообщение было отмечено Т_Ё_М_А как решение

Решение

Java
1
pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 0, myIntent,0);
Второй параметр должен быть уникальным.
Например, System.currentTimeMillis() приведенный к int.

И, конечно, свой PendingIntent для каждого аларма.
1
25 / 8 / 2
Регистрация: 14.12.2009
Сообщений: 281
30.10.2014, 15:25  [ТС]
Netscape, Спасибо!
Java
1
2
3
4
5
6
7
Intent myIntent = new Intent(MainActivity.this, MyReceiver.class);
    pendingIntent1 = PendingIntent.getBroadcast(MainActivity.this, 0, myIntent,0);
    pendingIntent2 = PendingIntent.getBroadcast(MainActivity.this, 1, myIntent,0);
    
    alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
    alarmManager.set(AlarmManager.RTC, calendar1.getTimeInMillis(), pendingIntent1);    
    alarmManager.set(AlarmManager.RTC, calendar2.getTimeInMillis(), pendingIntent2);
Поправил, и всё заработало как надо. Только всё равно выводится напоминание когда открываешь приложение (с текущим временем). Почему так?
0
 Аватар для Netscape
374 / 361 / 52
Регистрация: 02.10.2009
Сообщений: 712
Записей в блоге: 4
30.10.2014, 15:44
Цитата Сообщение от Т_Ё_М_А Посмотреть сообщение
Только всё равно выводится напоминание когда открываешь приложение (с текущим временем).
Сложно сказать что-то конкретное по тому коду что есть.
0
25 / 8 / 2
Регистрация: 14.12.2009
Сообщений: 281
30.10.2014, 16:14  [ТС]
Вот весь MainActivily.java
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
public class MainActivity extends TabActivity  {
    private PendingIntent pendingIntent1, pendingIntent2;
      
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        AlarmManager alarmManager;  
    Calendar calendar1 = Calendar.getInstance();
    Calendar calendar2 = Calendar.getInstance();    
    
    calendar1.set(Calendar.DAY_OF_WEEK, 5);//с воскресенья отсчёт 
    calendar1.set(Calendar.HOUR_OF_DAY, 14);
    calendar1.set(Calendar.MINUTE, 21);
    calendar1.set(Calendar.SECOND, 0);
    
    calendar2.set(Calendar.DAY_OF_WEEK, 5);//с воскресенья отсчёт 
    calendar2.set(Calendar.HOUR_OF_DAY, 14);
    calendar2.set(Calendar.MINUTE, 22);
    calendar2.set(Calendar.SECOND, 0);
    
    Intent myIntent = new Intent(MainActivity.this, MyReceiver.class);
    alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
    pendingIntent1 = PendingIntent.getBroadcast(MainActivity.this, 0, myIntent,0);
    pendingIntent2 = PendingIntent.getBroadcast(MainActivity.this, 1, myIntent,0);
    
    alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
    alarmManager.set(AlarmManager.RTC, calendar1.getTimeInMillis(), pendingIntent1);    
    alarmManager.set(AlarmManager.RTC, calendar2.getTimeInMillis(), pendingIntent2);
    
        // получаем TabHost
        TabHost tabHost = getTabHost();
        // инициализация была выполнена в getTabHost
        // метод setup вызывать не нужно
       // TabHost.TabSpec tabSpec;
        TabSpec spec;
        Intent intent;
        View view;
        int id_img, id_bg; 
 
        intent = new Intent().setClass(this, OneActivity.class);
        view = createTabView(tabHost.getContext(), R.string.text_about_method, id_img=R.drawable.icon_methods,id_bg=R.drawable.tab_bg1); //создаём пользовательский view для таба
        spec = tabHost.newTabSpec("tab1").setIndicator(view).setContent(intent);   
        tabHost.addTab(spec);
        
        intent = new Intent().setClass(this, Exercises_ListView_Activity.class);
        view = createTabView(tabHost.getContext(), R.string.text_exercises, id_img=R.drawable.icon_exercises, id_bg=R.drawable.tab_bg2);
        spec = tabHost.newTabSpec("tab2").setIndicator(view).setContent(intent);
        tabHost.addTab(spec);  
    }
    private static View createTabView(final Context context, final int textAboutMethod, int id_img, int id_bg) {
 
        View view = LayoutInflater.from(context).inflate(R.layout.tab_bg, null);
       LinearLayout li=(LinearLayout) view.findViewById(R.id.tabsMainLayout);
        ImageView iv=(ImageView) view.findViewById(R.id.imageView1);
        TextView tv = (TextView) view.findViewById(R.id.tabsText);
        li.setBackgroundResource(id_bg);
        tv.setText(textAboutMethod);
        iv.setImageResource(id_img);
        
        return view;        
}   
}
Добавлено через 3 минуты
Появляется напоминание при переходе в MainActivily (При открытии приложения, и если закрылся экран, а предыдущем был MainActivily) с текущем временем.
0
 Аватар для Netscape
374 / 361 / 52
Регистрация: 02.10.2009
Сообщений: 712
Записей в блоге: 4
30.10.2014, 16:42
Скорее всего неправильно вычисляется время старта.
т.е. 2-й параметр triggerAtMillis метода set.

В документации сказано, что если установить время которое уже прошло, аларм будет вызван немедленно.
Можно попробовать вывести в консоль calendar1.getTimeInMillis() и System.currentTimeMillis() и уже потом смотреть, что получилось.

Еще одно замечание. Broadcast можно вообще удалить, так как в классе PendingIntent есть метод getService, который сразу запустит сервис. Broadcast здесь просто не нужное звено.
0
25 / 8 / 2
Регистрация: 14.12.2009
Сообщений: 281
30.10.2014, 17:50  [ТС]
Netscape, да напоминание выскакивает, только если установленное время уже прошло. Как же этого избежать?
0
 Аватар для Netscape
374 / 361 / 52
Регистрация: 02.10.2009
Сообщений: 712
Записей в блоге: 4
30.10.2014, 18:28
Java
1
2
3
if (calendar1.getTimeInMillis() > System.currentTimeMillis()) {
// set up alarm
}
Добавлено через 1 минуту
Смотреть на дату, если время прошло, то к чему вообще это напоминание?
1
25 / 8 / 2
Регистрация: 14.12.2009
Сообщений: 281
30.10.2014, 23:38  [ТС]
Цитата Сообщение от Netscape Посмотреть сообщение
Еще одно замечание. Broadcast можно вообще удалить, так как в классе PendingIntent есть метод getService, который сразу запустит сервис. Broadcast здесь просто не нужное звено.
BroadcastReceiver я оставил, чтобы воскрешать службу после перезагрузки.
XML
1
2
3
4
5
<receiver android:name=".MyReceiver">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
    </receiver>
Только ресивер вызывает службу, а расписание календарей у нас в Activity. Как заново настроить AlarmManager после перезагрузки?
0
 Аватар для Netscape
374 / 361 / 52
Регистрация: 02.10.2009
Сообщений: 712
Записей в блоге: 4
31.10.2014, 11:07
Цитата Сообщение от Т_Ё_М_А Посмотреть сообщение
Как заново настроить AlarmManager после перезагрузки?
Скопировать код создание аларма в BroadcastReceiver.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
31.10.2014, 11:07
Помогаю со студенческими работами здесь

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

AlarmManager
Всем привет. Взял код AlarmManager отсюда. В свой проект добавил AlarmManagerBroadcastReceiver.java и код AlarmManagerActivity.java в свое...

AlarmManager
Добрый вечер, как задать время вручную ? alarmManager.set(AlarmManager.RTC, System.currentTimeMillis(), pendingIntent);

Как грамотно нормализовать даты в БД расписаний сеансов в кинотеатрах?
Добрый день. Вот пример Перейдя на страницу, можно увидеть, что в один и тот же день в разных кинотеатрах будет кучу сеансов этого...

Метод ветвей и границ для задачи теории расписаний
Добрый день. Стоит задача распределить методом ветвей и границ несколько объектов (в программе называются модули), имеющие свою...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru