Я работаю над приложением будильника, которое может иметь несколько сигналов тревоги.По этой причине я пытался использовать класс 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