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

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

Войти
Регистрация
Восстановить пароль
 
mathahakar
2 / 2 / 1
Регистрация: 31.01.2014
Сообщений: 80
#1

AlarmManager android траблы - Программирование Android

07.04.2016, 18:23. Просмотров 148. Ответов 0

Пожалуйста, помогите с вопросом.
Очень туго почему-то заходит мне тема с Alarm-ами.
Суть такова:
Имеется таблица в БД, в которой каждая запись содержит день недели, часы и минуты для сигнала (что-то вроде будильника). И, когда наступает время, должна вызываться активити (при чём, даже в режиме сна, но это детали уже). Вот, накидал такой код:
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
public class TaskScanner {
 
    Context context;
    DBHelper dbHelper;
 
    public TaskScanner (Context context, DBHelper dbHelper) {
        this.context = context;
        this.dbHelper = dbHelper;
    }
 
    /**
     * Сканирование задач из таблицы SCHEDULE
     * и установка их сигналов
     */
    public void scanTasks () {
        int rows = dbHelper.getRowsQuantity("SCHEDULE");
 
        SQLiteDatabase db = dbHelper.getReadableDatabase();
        Cursor c = db.query("SCHEDULE", null, null, null, null, null, null);
 
        int dayColIndex = c.getColumnIndex("DAY");
        int hourColIndex = c.getColumnIndex("HOURS");
        int minuteColIndex = c.getColumnIndex("MINUTES");
 
        // Цикл для чтения таблицы БД и записи данных в переменные
        for (int i = 0; i < rows; i ++) {
            // Дефолтные значения переменных
            int hour = 0;
            int minute = 0;
            int dayOfWeek = 0;
 
            // Получение значений из БД
            if (c.moveToNext()) {
                hour = c.getInt(hourColIndex);
                minute = c.getInt(minuteColIndex);
                dayOfWeek = c.getInt(dayColIndex);
            }
 
            // Получение объекта календаря с текущим временем
            Calendar cal = Calendar.getInstance();
 
            // добавление сигнала
            cal.set(Calendar.DAY_OF_WEEK, dayOfWeek + 1);
            cal.set(Calendar.HOUR_OF_DAY, hour);
            cal.set(Calendar.MINUTE, minute);
            cal.set(Calendar.SECOND, 0);
 
            AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
            Intent intent = new Intent(context, AlarmReceiver.class);
            intent.putExtra("alarm message", "alarm message");
            PendingIntent sender = PendingIntent.getBroadcast(context, 192837, intent, PendingIntent.FLAG_UPDATE_CURRENT);
            am.setInexactRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), AlarmManager.INTERVAL_DAY, sender);
            }
    }
}
И BroadcastReceiver :

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 AlarmReceiver extends BroadcastReceiver {
 
    private static final String ACTION_BOOT = "android.intent.action.BOOT_COMPLETED";
 
    @Override
    public void onReceive(Context context, Intent intent) {
        if (ACTION_BOOT.equals(intent.getAction())) {
            try {
                Bundle bundle = intent.getExtras();
                String message = bundle.getString("alarm_message");
                Intent newIntent = new Intent(context, SignalsActivity.class);
                newIntent.putExtra("alarm_message", message);
                newIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(newIntent);
            } catch (Exception e) {
                Toast.makeText(context, "There was an error somewhere, but we still received an alarm", Toast.LENGTH_SHORT).show();
                e.printStackTrace();
 
            }
        }
    }
}
Вызываю метод scanTasks() в MainActivity в onCreate();

Значится, что плохо:
1) Ресивер не срабатывает при перезагрузке устройства. Объясните, пожалуйста, принцип его срабатывания. В манифесте он прописан, ровно как и permission на получение окончания загрузки:

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="dailytoys.exreminder">
 
    <uses-sdk
        android:minSdkVersion="14"
        android:targetSdkVersion="19" />
 
    <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:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
 
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
 
        <activity
            android:name=".ExercisesActivity"
            android:label="@string/app_name"
            android:theme="@style/AppTheme.NoActionBar">
        </activity>
 
        <activity
            android:name=".SignalsActivity"
            android:label="@string/app_name"
            android:theme="@style/AppTheme.NoActionBar">
        </activity>
 
        <receiver android:name='.AlarmManagerEx.AlarmReceiver'>
        </receiver>
 
        <!-- ATTENTION: This was auto-generated to add Google Play services to your project for
             App Indexing.  See [url]https://g.co/AppIndexing/AndroidStudio[/url] for more information. -->
        <meta-data
            android:name="com.google.android.gms.version"
            android:value="@integer/google_play_services_version" />
 
    </application>
 
</manifest>
2) Если не обращать внимания на неработу после перезагрузки, то появляется другая проблема. В БД есть множество записей, например: "понедельник 15:00", "вторник 16:30", "четверг 12:00", "четверг 18:30".
И вот соль в том, что алармы то срабатывают, НО. Мгновенно. Если допустим, сейчас четверг, 18:20 , а запись есть в БД про четверг 18:00, то аларм срабатывает мгновенно.
3) Возможно, я что-то не так понял:
В onReceive мы обрабатываем реакцию менеджера на обращение к нему. Пожалуйста, скажите, правильно я понимаю (судя по комментариям в коде):
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
public class AlarmReceiver extends BroadcastReceiver {
    // Константа завершения загрузки девайса
    private static final String ACTION_BOOT = "android.intent.action.BOOT_COMPLETED";
 
    @Override
    public void onReceive(Context context, Intent intent) {
        if (ACTION_BOOT.equals(intent.getAction())) { // Реагируем на окончание загрузки устройства
            try {
                Bundle bundle = intent.getExtras();
                String message = bundle.getString("alarm_message");
                Intent newIntent = new Intent(context, SignalsActivity.class);
                newIntent.putExtra("alarm_message", message);
                newIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(newIntent);
            } catch (Exception e) {
                Toast.makeText(context, "There was an error somewhere, but we still received an alarm", Toast.LENGTH_SHORT).show();
                e.printStackTrace();
            }
        } else { // Реагируем на все остальные возможные состояния устройства
            try {
                Bundle bundle = intent.getExtras();
                String message = bundle.getString("alarm_message");
                Intent newIntent = new Intent(context, SignalsActivity.class);
                newIntent.putExtra("alarm_message", message);
                newIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(newIntent);
            } catch (Exception e) {
                Toast.makeText(context, "There was an error somewhere, but we still received an alarm", Toast.LENGTH_SHORT).show();
                e.printStackTrace();
            }
        }
    }
 
}
Помогите, пожалуйста, очень нужно.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.04.2016, 18:23     AlarmManager android траблы
Посмотрите здесь:

Таймер, AlarmManager и Service на Android - Программирование Android
Добрый вечер. Я уже создавал тем(ы) про таймер. И мне очень здорово помогли разобраться с Андроидом, особенно OlegJV, powowstal....

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

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

AlarmManager и TextView - Программирование Android
Здравствуйте. Задача такая: есть AlarmManager и TextView. Как заставить AlarmManager отсчитывать время, заданное пользователем, и...

AlarmManager + Notification - Программирование Android
Взялся за создания Нотификаций в определённое время. До этого такого ещё такого не делал, без помощи гугла не обошлось. В фрагменте...

Не работает AlarmManager - Программирование Android
Суть проблемы в том что когда заеться время уведомления в это время нет.... Тут код есть...

AlarmManager и Service or Receiver? - Программирование Android
Целый день искал, но нифига не нашел( то что нашел помогло тоолько частично). Суть вот в чем, у меня есть AlarmManeger как уже всем и так...

AlarmManager работает ли? Состояние - Программирование Android
Как узнать состояние работающего (запущенного ) AlarmManager ? Добавлено через 2 минуты то есть нужна логика if...

AlarmManager после перезагрузки - Программирование Android
По задумке AlarmManager должен отрабатывать раз в день. Включаю (сейчас 18-00): alarmManager.setRepeating( AlarmManager.RTC, ...

Обновление приложения и AlarmManager - Программирование Android
Доброе утро, уважаемые форумчане! Хочу сделать приложение – будильник. С помощью AlarmManager запускаю приложение в нужное время, все...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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