AlarmReceiver не работает, когда занесен класс конструктора - PullRequest
0 голосов
/ 07 октября 2018

Я работаю над приложением будильника, которое может иметь несколько сигналов тревоги.По этой причине я пытался использовать класс Alarm для создания каждого аварийного сигнала и присоединять AlarmManager и PendingIntent для каждого аварийного сигнала к этому экземпляру.

Я смогзаставить работать будильник, просто создав его без класса Alarm, но теперь я бы хотел увеличить его.Похоже, что данные передаются нормально, но само AlarmReceiver никогда не срабатывает.

Alarm.java :

public class Alarm implements Serializable {

    String name;
    int hour;
    int minute;
    boolean isPm;
    int[] daysActive;
    double snoozeTimer;

    AlarmManager alarmManager;
    PendingIntent pendingIntent;

    public Alarm(String startName, int startHour, int startMinute,
                 Boolean startIsPm, int[] startDaysActive, double startSnoozeTimer){

        name = startName;
        hour = startHour;
        minute = startMinute;
        isPm = startIsPm;
        daysActive = startDaysActive;
        snoozeTimer = startSnoozeTimer;

    }

В * создается новый сигнал тревоги CreateAlarmActivity.java , и закончил здесь.Я сейчас занимаюсь только созданием будильника, а не его обновлением.

public void finishAlarm(View view){
        EditText alarmName = findViewById(R.id.alarmName);
        String name = alarmName.getText().toString();
        Alarm alarm = new Alarm(name, alarmHour, alarmMinute, isPm, daysActive, snoozeTimer);
        Intent finishAlarmIntent = new Intent(this, MainActivity.class);

        // If we're creating an alarm.
        if (position == -1) {

            try {
                alarmList.add(alarm);
                finishAlarmIntent.putExtra("setAlarm", alarm);
            } catch (Exception e) {

            }
        }

        // Else, we're updating one.
        else {
            try {
                // Set the alarm we're updating to the new alarm.
                alarmList.set(position, alarm);
                finishAlarmIntent.putExtra("updateAlarm", alarm);
            } catch (Exception e) {

            }
        }

        // Head back to MainActivity.
        finishAlarmIntent.putExtra("alarmList", alarmList);
        startActivity(finishAlarmIntent);
    }

С передачей будильника в намерение под setAlarm мы затем отправляемся на MainActivity, чтобы посмотреть,установить тревогу.

Intent intent = getIntent();
        // If a new alarm was passed (created or updated) set the alarm.
        if (intent != null) {
            System.out.println("Intent not null.");
            if (intent.hasExtra("setAlarm")){
                Alarm alarm = (Alarm)getIntent().getSerializableExtra("setAlarm");
                System.out.println("We have isSetAlarm. Alarm hour = " + alarm.hour);
                setAlarm(alarm);
            } else {
                // Do something else
            }
        }

Наконец, он вызывает метод setAlarm.

public void setAlarm(Alarm alarm){
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(System.currentTimeMillis());
        // HOUR_OF_DAY is on 24 hour time, so if isPm is true, add 12 hours.
        if (alarm.isPm){
            calendar.set(Calendar.HOUR_OF_DAY, alarm.hour + 12);
        }
        else {
            calendar.set(Calendar.HOUR_OF_DAY, alarm.hour);
        }
        calendar.set(Calendar.MINUTE, alarm.minute);

        alarm.alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        Intent testIntent = new Intent(getApplicationContext(), AlarmReceiver.class);
        alarm.pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, testIntent, PendingIntent.FLAG_UPDATE_CURRENT);
        alarm.alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, calendar.getTimeInMillis(), alarm.pendingIntent);
        System.out.println("Setting alarm. Alarm set at " + alarm.hour + ":" + alarm.minute + ". IsPM = " + alarm.isPm);

    }

Последнее сообщение «Установка будильника» из System.out.println работает нормально.Часы будильника, минуты и вечера - все правильно.Но ничего не происходит, когда должен сработать будильник.AlarmReceiver отлично работает, когда я создаю сигнал тревоги непосредственно в MainActivity.

AlarmReceiver.java (я знаю, что это плохая идея - преобразовать объект из потока байтов и затем обратно обратно в байтыпоток, а не просто отправить его как есть, но если я не делаю этого, я часто получаю ошибки.)

public class AlarmReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(final Context context, Intent intent) {

        System.out.println("Beginning onReceive()");
        Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
        Ringtone r = RingtoneManager.getRingtone(context, notification);
        //r.play();


        ByteArrayInputStream bis = new ByteArrayInputStream(intent.getByteArrayExtra("alarm"));
        ObjectInputStream in = null;
        Alarm alarm = null;

        try {
            in = new ObjectInputStream(bis);
            alarm = (Alarm)in.readObject();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (in != null) {
                    in.close();
                }
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }

        Intent receiveIntent = new Intent(context, AlarmActivatedActivity.class);

        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ObjectOutputStream out;

        try {
            out = new ObjectOutputStream(bos);
            out.writeObject(alarm);
            out.flush();
            byte[] data = bos.toByteArray();
            receiveIntent.putExtra("alarm", data);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                bos.close();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }

        receiveIntent.setFlags(FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(receiveIntent);
    }
}

AlarmActivationActivity в настоящее время просто пользовательский интерфейс, безкроме функциональности, позволяющей вам вернуться обратно к MainActivity , так что это неважно.

Это должен быть весь соответствующий код, но в случае, если требуется больше, это хранилище с последними изменениями,Это должно быть публично.http://gitlab.csu.edu.au/Jay_Bailey/SnoozeProofAlarmClock

...