Я создал приложение, которое устанавливает будильник с определенной задержкой и т. Д. c. который сохраняется в общих настройках. Я хотел создать виджет, который бы запускал цикл будильника нажатием на него со всеми настройками, которые я записал в приложение, пока оно было открыто. Вот мой код виджета:
public class SetAlarmWidget extends AppWidgetProvider {
Double delay;
int howManyTimes;
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
for (int appWidgetId : appWidgetIds) {
double delayHours;
double delayMinutes;
final SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
boolean amountRestricted = sharedPreferences.getBoolean("amountSwitchState", false);
if (sharedPreferences.getString("delayHours", "0").equals("") && sharedPreferences.getString("delayMinutes", "0").equals("")) {
delay = 0.0;
} else if(sharedPreferences.getString("delayHours", "0").equals("")){
delayMinutes = Double.parseDouble(sharedPreferences.getString("delayMinutes", "0"));
delay = 60*1000*delayMinutes;
}else if(sharedPreferences.getString("delayMinutes", "0").equals("")){
delayHours = Double.parseDouble(sharedPreferences.getString("delayHours", "0"));
delay = (60 * 60 * 1000) * delayHours;
}else{
delayMinutes = Double.parseDouble(sharedPreferences.getString("delayMinutes", "0"));
delayHours = Double.parseDouble(sharedPreferences.getString("delayHours", "0"));
delay = (60 * 60 * 1000) * delayHours+ (60*1000) * delayMinutes;
}
if (sharedPreferences.getString("amount", "0").equals("")) {
howManyTimes = 0;
} else {
howManyTimes = Integer.parseInt(sharedPreferences.getString("amount", "0"));
}
if (delay>0) {
double tmpDelay = delay;
startAlarm(context);
}
}
}
private void startAlarm(Context context) {
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, AlertReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 1, intent, 0);
assert alarmManager != null;
alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
SystemClock.elapsedRealtime() + delay.longValue(),
delay.longValue(), pendingIntent);
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
SharedPreferences.Editor editor = sharedPreferences.edit();
boolean amountRestricted = sharedPreferences.getBoolean("amountSwitchState", false);
boolean hourRestricted = sharedPreferences.getBoolean("hourSwitchState", false);
Calendar calendar = Calendar.getInstance();
int currentHours = calendar.get(Calendar.HOUR_OF_DAY);
int currentMinutes = calendar.get(Calendar.MINUTE) + currentHours * 60;
int minutesToLast=0;
if(hourRestricted)
{
String setTime = sharedPreferences.getString("lastHour", "false");
String[] parts = setTime.split(":");
String part1 = parts[0]; // 004
String part2 = parts[1];
int setHours = Integer.parseInt(part1);
int setMinutes = Integer.parseInt(part2) + setHours * 60;
if (!setTime.equals("false")) {
if (currentMinutes < setMinutes) {
minutesToLast = setMinutes - currentMinutes;
} else {
minutesToLast = 24 * 60 - currentMinutes + setMinutes;
}
}
}
int howManyTimesFromHour=-1;
int minutesTemp=minutesToLast;
while(minutesTemp>=0)
{
minutesTemp-=delay/60000;
howManyTimesFromHour++;
}
if(amountRestricted && hourRestricted)
{
editor.putInt("desiredBursts", Math.min(howManyTimes, howManyTimesFromHour));
editor.putBoolean("setRestricted", true);
}else if(amountRestricted){
editor.putInt("desiredBursts", howManyTimes);
editor.putBoolean("setRestricted", true);
}else if(hourRestricted){
editor.putInt("desiredBursts", howManyTimesFromHour);
editor.putBoolean("setRestricted", true);
}else{
editor.putInt("desiredBursts", 1);
editor.putBoolean("setRestricted", false);
}
editor.putInt("elapsedBursts", 0);
editor.putString("setDelay", delay.toString());
editor.apply();
}
}
Проблема в том, что когда я нажимаю на виджет, он ничего не делает. Метод startAlarm отличается от метода MainActivity только использованием context
вместо this