Android AlarmManager повторяется только один раз
Я пытаюсь работать с AlarmManager
и сервис для отправки авто СМС на какой-то номер. Я следовал некоторым урокам и написал что-то вроде этого:
SwitchPreference testPref = (SwitchPreference) findPreference("key_auto_sms");
SharedPreferences sharedPrefs = getActivity().getSharedPreferences("XXXXXXXXX", MODE_PRIVATE);
testPref.setChecked(sharedPrefs.getBoolean("AutoSMS", false));
testPref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
if (testPref.isChecked()) {
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
int curHr = calendar.get(Calendar.HOUR_OF_DAY);
// Checking whether current hour is over 14
if (curHr >= 15)
{
// Since current hour is over 15, setting the date to the next day
calendar.add(Calendar.DATE, 1);
}
calendar.set(Calendar.HOUR_OF_DAY, 15);
calendar.set(Calendar.MINUTE, 1);
calendar.set(Calendar.SECOND, 00);
AlarmManager am = (AlarmManager) getActivity().getSystemService(Context.ALARM_SERVICE);
Intent i = new Intent(getActivity(), AlarmReceiver.class);
final PendingIntent pi = PendingIntent.getBroadcast(getActivity(), 0, i, PendingIntent.FLAG_UPDATE_CURRENT);
am.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pi);
SharedPreferences.Editor editor = getActivity().getSharedPreferences("XXXXXXXXX", MODE_PRIVATE).edit();
editor.putBoolean("AutoSMS", true);
editor.commit();
Toast.makeText(getActivity(), getResources().getString(R.string.Auto_SMS_Enable), Toast.LENGTH_SHORT).show();
} else {
SharedPreferences.Editor editor = getActivity().getSharedPreferences("com.camel.work_list", MODE_PRIVATE).edit();
editor.putBoolean("AutoSMS", false);
editor.commit();
Toast.makeText(getActivity(), getResources().getString(R.string.Auto_SMS_Cancle), Toast.LENGTH_SHORT).show();
Intent intent1 = new Intent(getActivity(), AlarmReceiver.class);
final PendingIntent pendingIntent = PendingIntent.getBroadcast(getActivity(), 0, intent1, PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager alarm = (AlarmManager) getActivity().getSystemService(Context.ALARM_SERVICE);
alarm.cancel(pendingIntent);
//getActivity().stopService(intent1);
}
return false;
}
});
}
Мой BroadcastReceiver:
public class AlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// MY auto sms method.....
}
}
Так что проблема в том, что будильник сработает только один раз, а затем на следующий день он отключится.
Что мне не хватает?
1 ответ
Вы не должны использовать setRepeating(), потому что он не точен во временных интервалах. Вы можете использовать функцию set() одновременно, она будет работать более точно, когда вызывается трансляция, вы можете снова вызвать set() (например, рекурсивно), она будет работать. Это мой код установки будильника. Он не будет работать с некоторыми устройствами, такими как huawei, потому что процессы будут убиты. С huawei я использую JobScheduler. Он работает хорошо, если экран яркий, когда экран выключен. Это не работает правильно. Недавно появилась библиотека WorkManager, которая работает лучше для всех устройств, у меня не было времени ее исследовать, поэтому я не даю никаких советов по поводу библиотеки WorkManager. Надеюсь, поможет
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
assert alarmManager != null;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
alarmManager.setAlarmClock(new AlarmManager.AlarmClockInfo(time, pendingIntent), pendingIntent);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
alarmManager.setExact(AlarmManager.RTC_WAKEUP, time, pendingIntent);
} else {
alarmManager.set(AlarmManager.RTC_WAKEUP, time, pendingIntent);
}