我正在使用我的应用程序上的警报管理器,我需要在凌晨2:00重置一些DefaultSharedPreferences值(设置为0)。 我的主要活动有一个函数,只要应用程序打开就会调用它:
protected void setUpAlarmManager(){ //To delete the data of each day and pass it to Records database
AlarmManager alarmManager = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(this, AlarmReceiver.class);
PendingIntent pIntent = PendingIntent.getBroadcast(this, 1, intent, PendingIntent.FLAG_CANCEL_CURRENT);
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 02);
calendar.set(Calendar.MINUTE, 00);
calendar.set(Calendar.SECOND, 00);
alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY , pIntent); //set repeating every 24 hours
Log.i("Set", "Alarm set");
}
然后我使用BroadcastReceiver重置值。
package com.javierd.iifym;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.util.Log;
import com.javierd.iifym.sqlite.RecordsDataSource;
//To delete the data of each day and pass it to Records database
public class AlarmReceiver extends android.content.BroadcastReceiver {
private RecordsDataSource dataSource;
private Utils utils;
@Override
public void onReceive(Context context, Intent intent) {
Log.i("Time", "TIMEEEE!!!!");
SharedPreferences macros = context.getSharedPreferences(context.getPackageName() + "_preferences", Context.MODE_PRIVATE); //As we store data using DefaultSharedPreferences, not SharedPreferences
SharedPreferences.Editor editor = macros.edit();
editor.putString("eaten_carbs", "0");
editor.putString("eaten_proteins", "0");
editor.putString("eaten_fats", "0");
editor.apply();
}
}
接收器工作,问题是AlarmManager随机工作。虽然它应该是凌晨2点,也许您在16:00输入应用程序,保存一些值,在下次您在17:30输入时,值被删除,或者可能不是,这是随机的我不明白。
答案 0 :(得分:2)
这种影响是由我相信使用AlarmManager.setInexectRepeating(int, long, long, PendingIntent)
引起的。
根据{{3}}
您的闹钟首次触发不会在请求的时间之前,但是 在此之后几乎整整一段时间内可能不会发生。
当您使用此方法时,Android会同步多个不准确的重复警报并同时触发它们。考虑到间隔是一天,警报可能会在17:30发射。
如果警报需要在凌晨2点准确触发,那么我建议使用documentation方法。
请注意,建议尽可能避免使用准确的警报以减少电池消耗。
更新
我建议检查过去的触发时间是否为。
请你试试
protected void setUpAlarmManager(){ //To delete the data of each day and pass it to Records database
AlarmManager alarmManager = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(this, AlarmReceiver.class);
PendingIntent pIntent = PendingIntent.getBroadcast(this, 1, intent, PendingIntent.FLAG_CANCEL_CURRENT);
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 2);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
if (Calendar.getInstance().after(calendar)) {
calendar.add(Calendar.DAY_OF_MONTH, 1);
}
alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY , pIntent); //set repeating every 24 hours
Log.i("Set", "Alarm set");
}