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

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Delphian
0 / 0 / 0
Регистрация: 14.08.2012
Сообщений: 113
#1

Не работает AlarmManger - Android

16.05.2016, 18:21. Просмотров 75. Ответов 11
Метки нет (Все метки)

Всем добрый день.

Пробую запустить AlarmManager, но видимо, где-то что-то упустил.

в MainActivity:
Java
1
2
3
4
5
    @Override
    protected void onResume() {
        super.onResume();
        AlarmManagerReceiver.SetAlarm(this);
}
в Бродкасте:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class AlarmManagerReceiver extends BroadcastReceiver {
 
    @Override
    public void onReceive(Context context, Intent intent) {
        PowerManager pm=(PowerManager) context.getSystemService(Context.POWER_SERVICE);
        PowerManager.WakeLock wl= pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,"TAG");
        
       Toast.makeText(context,"Alarm",Toast.LENGTH_SHORT).show();
 
    }
 
    public static void SetAlarm(Context context)
    {
        AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
        Intent intent=new Intent(context, AlarmManagerReceiver.class);
        PendingIntent pi= PendingIntent.getBroadcast(context,0, intent,0);
        am.setRepeating(AlarmManager.RTC_WAKEUP,System.currentTimeMillis(),10000,pi);
    }
}
в Манифесте:
XML
1
2
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<receiver android:name=".receivers.AlarmManagerReceiver"/>
Программу запускаю, но тоаст так и не показывается. Где я мог что-то упустить? Заранее, спасибо за помощь!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Паблито
2240 / 1813 / 564
Регистрация: 12.05.2014
Сообщений: 6,456
Завершенные тесты: 1
17.05.2016, 09:54     Не работает AlarmManger #2
а где?
Java
1
        registerReceiver(new AlarmManagerReceiver());
fraley
103 / 103 / 37
Регистрация: 24.05.2015
Сообщений: 312
17.05.2016, 10:43     Не работает AlarmManger #3
Цитата Сообщение от Паблито Посмотреть сообщение
а где?
Так в Манифесте же.
XML
1
<receiver android:name=".receivers.AlarmManagerReceiver"/>
Добавлено через 8 минут
И кстати в Манифесте к ресиверу надо добавить:
XML
1
2
android:enabled="true"
            android:exported="false"
Паблито
2240 / 1813 / 564
Регистрация: 12.05.2014
Сообщений: 6,456
Завершенные тесты: 1
17.05.2016, 10:54     Не работает AlarmManger #4
у меня наводящий вопрос - на какое событие сработает ресивер?
fraley
103 / 103 / 37
Регистрация: 24.05.2015
Сообщений: 312
17.05.2016, 11:32     Не работает AlarmManger #5
Паблито, хороший вопрос)))
Delphian
0 / 0 / 0
Регистрация: 14.08.2012
Сообщений: 113
17.05.2016, 17:31  [ТС]     Не работает AlarmManger #6
Паблито, насколько я понял, вот здесь устанавливаем срабатывание по времени am.setRepeating(AlarmManager.RTC_WAKEUP,System.currentTimeMillis(),10000,pi), то есть каждые 10 секунд аларм менеджер должен срабатывать?

Добавлено через 1 минуту
fraley, а для чего нужен enabled и exported?
Паблито
2240 / 1813 / 564
Регистрация: 12.05.2014
Сообщений: 6,456
Завершенные тесты: 1
17.05.2016, 17:32     Не работает AlarmManger #7
еще раз
Цитата Сообщение от Паблито Посмотреть сообщение
у меня наводящий вопрос - на какое событие сработает ресивер?
Delphian
0 / 0 / 0
Регистрация: 14.08.2012
Сообщений: 113
17.05.2016, 17:52  [ТС]     Не работает AlarmManger #8
Паблито, изначально мне необходимо сделать так, чтобы раз в день программа отправляла письмо на почту с вложенным файлом, поэтому событие это наступление определённого момента времени, например, 23.00 или 24.00, но в текущем коде я просто тестировал аларм менеджер и установил, чтобы аларм менеджер срабатывал каждые 10 секунд, после того как я его запустил в MainActivity. Таким образом, мне нужно просто сделать так, чтобы программа просыпалась в 23.00, отправляла письмо на почту и выключалась и это было каждый день! Может я неправильным путём иду?
fraley
103 / 103 / 37
Регистрация: 24.05.2015
Сообщений: 312
17.05.2016, 19:24     Не работает AlarmManger #9
Цитата Сообщение от Delphian Посмотреть сообщение
fraley, а для чего нужен enabled и exported?
• android:enabled: если имеет значение "true", то сервис может ли создаваться системой. Значение по умолчанию - "true".
• android:exported: указывает, могут ли другие компоненты приложения обращаться к сервису. Если имеет значение "true", то могут, если имеет значение "false", то нет.
Delphian, Паблито намекает вам, что необходим intent-filter на который будет срабатывать ресивер.
Delphian
0 / 0 / 0
Регистрация: 14.08.2012
Сообщений: 113
18.05.2016, 10:51  [ТС]     Не работает AlarmManger #10
fraley, да, точно, фильтра нет, но какой здесь можно поставить фильтр, если мне нужно чтобы было срабатывание в определённое время один раз в день?

Добавлено через 32 минуты
На текущий момент, сделал вот так в Манифесте
XML
1
2
3
4
5
6
        <receiver android:name=".receivers.AlarmManagerReceiver"
            android:enabled="false">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED"></action>
            </intent-filter>
        </receiver>
и добавил в метод onReceive
Java
1
2
3
        if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) {
            SetAlarm(context);
        }
Загрузил программу на телефон, потом сделал перезагрузку и всё равно никаких тостов не показывает
Паблито
2240 / 1813 / 564
Регистрация: 12.05.2014
Сообщений: 6,456
Завершенные тесты: 1
18.05.2016, 11:01     Не работает AlarmManger #11
по идее на это событие действительно не нужно ручками регистрировать ресивер
тогда надо проверить в манифесте разрешение
XML
1
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
и событие это может прилететь не сразу после перезагрузки, я когда-то игрался и мне бывало и через 1-3 минуты прилетало
Delphian
0 / 0 / 0
Регистрация: 14.08.2012
Сообщений: 113
18.05.2016, 13:47  [ТС]     Не работает AlarmManger #12
Паблито, спасибо за помощь, этот пермишен я добавил сразу когда добавлял интент, в конечном итоге я немного иначе разбил класcы сделал два бродкаста и заработало, не знаю, что именно помогло, но возможно кому-то понадобиться рабочий пример:
Manifest:
Java
1
2
3
4
5
6
7
8
9
10
11
    <uses-permission android:name="android.permission.WAKE_LOCK"/>
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
 
        <receiver android:name=".receivers.BootReceiver"
            android:enabled="false">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED"></action>
            </intent-filter>
        </receiver>
 
        <receiver android:name=".receivers.AlarmManagerReceiver" android:enabled="true"/>
Настройка аларм менеджера
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class AlarmActivity {
 
    public static void SetAlarm(Context context)
    {
        // Set the alarm to start at approximately 23:00 p.m.
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(System.currentTimeMillis());
        calendar.set(Calendar.HOUR_OF_DAY, 23);
 
        AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
        Intent intent=new Intent(context, AlarmManagerReceiver.class);
        PendingIntent pi= PendingIntent.getBroadcast(context,0, intent,0);
        //Set the interval
        am.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.currentTimeMillis(),AlarmManager.INTERVAL_DAY,pi);
    }
}
BootReceiver:
Java
1
2
3
4
5
6
7
8
public class BootReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) {
            AlarmActivity.SetAlarm(context);
        }
    }
}
AlarmManagerReceiver
Java
1
2
3
4
5
6
7
8
9
public class AlarmManagerReceiver extends BroadcastReceiver {
 
    public static final String EVERY_DAY="everyday";
 
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context,"Alarm",Toast.LENGTH_SHORT).show();
    }
}
Стоит сказать, что у меня изначально стояло повторение раз в 10 секунд, но почему то сообщение выводилось только раз в минуту, не знаю с чем это связано, но так как мне достаточно раз в день, то дальше не копался.
Yandex
Объявления
18.05.2016, 13:47     Не работает AlarmManger
Ответ Создать тему
Опции темы

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