Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
17 / 5 / 0
Регистрация: 16.04.2016
Сообщений: 338
1

Alarm не срабатывает через заданный промежуток времени

01.02.2018, 21:29. Показов 2002. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всех приветствую. Мне нужно написать будильник. Для решения этой задачи я решил использовать класс alarm,поскольку,как я понял,он лучше всего подходит для этого. Сразу скажу,что у меня api 24 (Седьмой андроид). Когда я устанавливаю будильник методом setAlarm(),отлавливая при этом соответствующий интент в ресивере,почему-то при первой загрузке приложения будильник срабатывает где-то через минуту,хотя он должен сработать сразу же при запуске активити,а когда я ставлю повторяющийся будильник,он тоже срабатывает с более длинным интервалом,чем я хочу,т.е интервал гораздо больше 5 секунд. Может я вообще зря использую alarm и для будильника лучше использовать какой-нибудь timer или делать задержки и выполнять алгоритм в отдельном потоке? Таймер мне не нравится,поскольку минимальное значение,с которым он работает,это одна секунда,а системное время отображается в миллисекундах. Таким образом,если,к примеру,пользователь поставит будильник на 11 часов (3960000 секунд),а таймер будет запущен,к примеру,в десять часов и одна миллисекунда,он пропустит время 11 часов 0 миллисекунд,а значит будильник не сработает. Конечно,можно проверять не то,равно ли системное время времени,указанное пользователем,находится ли разность между системным временем и временем,указанным пользователем в интервале [0,1000) миллисекунд,но тогда будильник сработает не очень точно. Что касается второго варианта,так код получится слишком громоздкий и возможно придётся использовать несколько потоков,хотя я и не уверен в этом. В общем подскажите пожалуйста,почему будильник при запуске activity срабатывает и повторяется с очень большой задержкой,хотя он должен повторяться 5 секунд? Может всё же я зря использую класс alarm? Ещё подскажите пожалуйста,как более точно и правильно отсчитать минуту (время,которое будет работать будильник),чтобы потом отработал мой алгоритм. Заранее всем огромное спасибо за помощь. Ниже будет код моей активити,ресивера и манифеста.
MainActivity.java
[JAVA]package ru.kav.alarm;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;

import ru.kav.alarm.AlarmReceiver;
import ru.kav.alarm.AlarmReceiver;
import ru.kav.alarm.R;

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class MainActivity extends AppCompatActivity {
public static AlarmReceiver alarm;
@Override
protected void onStart() {
super.onStart();
    alarm = new AlarmReceiver();
    if(alarm!=null) alarm.setAlarm(this.getApplicationContext(),System.currentTimeMillis(),5000);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
 
}
@Override
    protected void onDestroy() {
super.onDestroy();
// Отменяем будильник и уничтожаем ресивер
alarm.cancelAlarm(this.getApplicationContext());
alarm=null;
}
}
AlarmReceiver.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
package ru.kav.alarm;
 
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.media.AudioManager;
import android.media.ToneGenerator;
import android.os.PowerManager;
import android.provider.MediaStore;
import android.widget.Toast;
 
public class AlarmReceiver 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,"alarm");
wl.acquire();
// Показываем уведомление и генерируем звуковой сигнал.
Toast.makeText(context,"Тестируем Будильник",0).show();
        ToneGenerator toneGenerator = new ToneGenerator(AudioManager.STREAM_MUSIC,ToneGenerator.MAX_VOLUME);
        toneGenerator.startTone(toneGenerator.TONE_CDMA_ALERT_CALL_GUARD,60000);
        toneGenerator.release();
wl.release();
}
public void setAlarm(Context context,long timeInMilis,long intervalInMilis)
{
        AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
        Intent intent=new Intent(context, AlarmReceiver.class);
PendingIntent pi= PendingIntent.getBroadcast(context,0, intent,0);
// Устанавливаем однократный или повторяющийся будильник в зависимости от параметра intervalInMilis
if (intervalInMilis>0) am.setRepeating(AlarmManager.RTC_WAKEUP,timeInMilis,intervalInMilis,pi); else am.set(AlarmManager.RTC_WAKEUP,timeInMilis,pi);
}
public void cancelAlarm(Context context)
    {
        Intent intent=new Intent(context, AlarmReceiver.class);
        PendingIntent sender= PendingIntent.getBroadcast(context,0, intent,0);
        AlarmManager alarmManager=(AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        alarmManager.cancel(sender);
    }
}
Манифест
XML
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
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="ru.kav.alarm">
    <uses-permission android:name="android.permission.SET_ALARM"/>
    <uses-permission android:name="android.permission.WAKE_LOCK"/>
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
<activity android:name=".MainActivity"
android:launchMode="singleInstance"
android:configChanges="orientation|screenSize|keyboardHidden">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <receiver android:name=".AlarmReceiver"
             android:enabled="true"
            android:exported="true">
            <intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
                * * </intent-filter>
        </receiver>
    </application>
</manifest>
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.02.2018, 21:29
Ответы с готовыми решениями:

Периодический alarm не срабатывает
Нужно установить alarm с некой периодичностью. Когда устанавливаю на 15 сек, то все работает...

Выполнение действий через заданный промежуток времени
Нужен самый простой пример програмки на си++ (работаю в вижуал студио), которая будет каждый равный...

Выполнить действие через заданный промежуток времени
Как сделать так, чтобы через каждый промежуток времени(15мин) выполнялось определённое действие?

Таймер (выполнение кода через заданный промежуток времени)
Всем привет, подскажите, как создать внутренний таймер, то есть через что бы через некоторое...

1
17 / 5 / 0
Регистрация: 16.04.2016
Сообщений: 338
05.02.2018, 19:33  [ТС] 2
Всех приветствую. Проблема была с моим интентом. Я не думал,что это сработает,но теперь будильник корректно срабатывает даже при первой загрузке активити. Теперь хотелось бы уточнить,как корректно отследить минуту,чтобы через минуту выполнить нужные действия и как вычислять дату и время для alarm,чтобы подставить это значение в методе setExact,т.е как поставить будильник на abc,где a - дата срабатывания будильника,b - час срабатывания будильника,а c - минута срабатывания будильника. Я знаю,что вроде можно для этого работать с timePicker и с календарём,но я не собираюсь добавлять в интерфейс моего приложения этот элемент,поэтому может можно обойтись без timePicker? За ранее благодарю всех за помощь. А решение моей проблемы оказалось очень простым,т.е нужно при создание интента добавить всего одну строчку. Честно говоря не думал,что решение этой пустяковой проблемы у меня займёт несколько дней. Просто я вообще думал,что дело в alarm. Для меня не понятно,почему без этого флага возникает эта проблема. Вот строчка,которая решает эту проблему:
Java
1
if (android.os.Build.VERSION.SDK_INT >= 16)intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
0
05.02.2018, 19:33
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.02.2018, 19:33
Помогаю со студенческими работами здесь

Вход на страницу и её закрытие через заданный промежуток времени
подскажите команду для входа на страницу и выхода с нее с заданным интервалом времени? Добавлено...

автоудаление определенной папки через заданный промежуток времени
Пожалуйста , подскажите программу (или инструмент в Windows 7) , которая могла бы безвозратно...

Смена картинок из папки через заданный промежуток времени
Добрый вечер! Хотел сделать простую смену картинок из папки. Вот код: &lt;img...

Ttimer смена интервала через заданный промежуток времени
Доброго времени суток. Такая задачка: Нужно заставить таймер срабатывать через разный...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru