不要投反对票。如果你认为问题需要澄清,那就评论这个问题。
我想在午夜更新我的sqlite表,所以调用broadcast receiver在午夜自动点击,即不启动应用程序。但是每次当我启动应用程序时,它都会更新。
代码:
在onCreate()
private void setTheTimeToUpdateTables(Context context) {
Log.i("Update table function","Yes");
AlarmManager alarmManager=(AlarmManager) getSystemService(ALARM_SERVICE);
Intent alarmIntent=new Intent(context,UpdateTables.class);
PendingIntent pendingIntent=PendingIntent.getBroadcast(context,0,alarmIntent,PendingIntent.FLAG_UPDATE_CURRENT);
alarmManager.cancel(pendingIntent);
Calendar alarmStartTime = Calendar.getInstance();
alarmStartTime.setTimeInMillis(System.currentTimeMillis());
alarmStartTime.set(Calendar.HOUR_OF_DAY, 0);
alarmStartTime.set(Calendar.MINUTE, 1);
alarmStartTime.set(Calendar.SECOND, 0);
System.out.println("Updating table time "+alarmStartTime);
System.out.println("Time in millseconds "+alarmStartTime.getTimeInMillis());
alarmManager.setInexactRepeating(AlarmManager.RTC,alarmStartTime.getTimeInMillis(),AlarmManager.INTERVAL_DAY,pendingIntent);
Log.d("Alarm","Set for midnight");
}
公共类UpdateTables扩展BroadcastReceiver {
DbHelper dbHelper;
ArrayList<ListMedicine> reminderInfo;
@Override
public void onReceive(Context context, Intent intent) {
dbHelper=new DbHelper(context);
Log.i("Service Start", CalculateDaysService.TAG);
context.startService(new Intent(context,CalculateDaysService.class));
Log.i("Done","Yes");
}
}
问题:- 1。每当我启动应用程序时,这个广播接收器都会被调用。2. 它不会在午夜被召唤。
首先,您正在制作一个时间位于过去的Calendar
。这将导致告警立即触发。
第二,setInexactRepeating()
不会使它在午夜触发。我建议您阅读该方法的文档以及AlarmManager
的其他方法,因为听起来您应该使用setExact()
方法之一。