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

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

Войти
Регистрация
Восстановить пароль
 
Zwei
2 / 2 / 0
Регистрация: 18.10.2013
Сообщений: 14
#1

Метод onReceive в BroadcastReceiver - Программирование Android

08.06.2014, 16:38. Просмотров 901. Ответов 0
Метки нет (Все метки)

Есть класс
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
public class Receiver extends BroadcastReceiver {
 
    Alarm nextAlarm;
    Context context;
    MainActivity mainActivity;
 
    Handler handler;
 
    public void setContext(Context context) {
        this.context = context;
        mainActivity = (MainActivity) context;
    }
 
    private void setNextAlarm() {
        cancelAlarm(context);
        nextAlarm = null;
        long minTime = Long.MAX_VALUE;
        for (Alarm alarm: mainActivity.alarms){
            if (alarm.getState() && alarm.getWhenAlarm() < minTime){
                if (alarm.getWhenAlarm() < System.currentTimeMillis())
                    alarm.setWhenAlarm();
                nextAlarm = alarm;
                minTime = alarm.getWhenAlarm();
            }
        }
        if (nextAlarm != null){
            setOnetimeTimer(context);
        }
 
    }
    public void setAlarms() {
        setNextAlarm();
    }
 
    public void setHandler(){
        handler = new Handler(){
            @Override
            public void handleMessage(Message msg) {
                Log.d("MY_TAG", "Хэндлер сработал");
                if (!nextAlarm.haveDays())
                    mainActivity.alarms.get(mainActivity.alarms.indexOf(nextAlarm)).setState(false);
                mainActivity.remakeList();
                setAlarms();
                SimpleDateFormat sdf = new SimpleDateFormat("EEE\thh:mm");
                AlertDialog.Builder adb = new AlertDialog.Builder(context);
                final MediaPlayer mp = new MediaPlayer();
                adb.setTitle("Сработал будильник");
                adb.setMessage(sdf.format(System.currentTimeMillis()));
                adb.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        mp.stop();
                        dialogInterface.dismiss();
                    }
                });
                try {
                    mp.setDataSource(nextAlarm.getPath());
                    mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
                    mp.setLooping(true);
                    mp.prepareAsync();
                    mp.start();
                } catch (IOException ex){
                    Log.d("MY_TAG", "Файл не найден");
                }
                adb.show();
            }
        };
    }
 
    @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, "MY_TAG");
        wl.acquire();
        Log.d("MY_TAG", "Сработал ресивер!");
        if (handler.sendEmptyMessage(0))
            Log.d("MY_TAG", "Отправка сообщения хэндлеру!");
        wl.release();
    }
 
 
    private void setOnetimeTimer(Context context){
        AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
        Intent intent = new Intent(context, Receiver.class);
        intent.putExtra("MY_ALARM", true);
        long alarmTime= nextAlarm.getWhenAlarm();
        PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0);
        am.set(AlarmManager.RTC_WAKEUP, alarmTime, pi);
        SimpleDateFormat sdf = new SimpleDateFormat("hh:mm EEE W d");
        Log.d("MY_TAG", "Установлен след.будильник на\t"+sdf.format(nextAlarm.getWhenAlarm()));
    }
 
 
    private void cancelAlarm(Context context)
    {
        Intent intent = new Intent(context, Receiver.class);
        PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, 0);
        AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        alarmManager.cancel(sender);
    }
 
}
Все поля инициализируются из Activity при помощи методов
receiver.setContext(this);
receiver.setAlarms();
receiver.setHandler();

При обращении к полю класса из onReceive ловлю NullPointerException, что я упускаю?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.06.2014, 16:38
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Метод onReceive в BroadcastReceiver (Программирование Android):

Не корректно отрабатывает метод onReceive() - Программирование Android
Имеется BroadcastReceiver, который должен отработать, если будет утеряно подключение к WiFi. Как должно быть: Приложение работает -...

Как запустить метод в Activity из BroadcastReceiver - Программирование Android
Здравствуйте!!! Все до банальности просто и повторяется, по кругу :) Новичок, увлекся Java &amp; Android... Пытаюсь изобразить приложения...

BroadcastReceiver - Программирование Android
У меня такой вопрос если я создал ресивер и прописал его в манифесте. Мой ресивер прослушивает определенные интенты. И у меня такой вопрос...

BroadcastReceiver и startActivity - Программирование Android
У меня есть служба и BroadcastReceiver. Когда приходит событие, то я вызываю startService. Если служба не запущена, то она запускается и...

Уведомления в BroadcastReceiver - Программирование Android
Привет, уважаемые! Прикрутил BroadcastReceiver, мониторю входящие смс, пытаюсь отключить звук входящего смс если оно удовлетворяет моим...

Чтение preferences в BroadcastReceiver - Программирование Android
Доброго времени суток. Сам смысл того что я делаю: есть активити, которая отображает состояние батареи, есть активити настроек и есть...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.06.2014, 16:38
Привет! Вот еще темы с ответами:

Servise, BroadcastReceiver, Activity - Программирование Android
Здравствуйте, есть сервис и активити, сервис возвращает данные активити через BroadcastReceiver... все работает отлично, но когда виходиш...

BroadcastReceiver + static переменная - Программирование Android
Работая с бродкаст ресивером задался вопросом, как же он всё-таки работает?) Есть следующий код, который фиксирует состояние телефонного...

Виджеты, BroadcastReceiver и Строки - Программирование Android
Здравствуйте. Занимаюсь созданием виджета. Делаю что то наподобие нажатия на кнопку. Использую Broadcast. Предполагается ,что после нажатия...

BroadcastReceiver, куда добавить код? - Программирование Android
помогите понять часть статьи https://habrahabr.ru/post/234425/. добрался до Для работы BroadcastReceiver'а надо добавить немного кода в...


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

Или воспользуйтесь поиском по форуму:
Ответ Создать тему
Опции темы

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