我设置此闹钟在X处开启且当前时间为Y并且在Y等待时间X发送时发出警报...有人可以告诉我为什么它不等到正确是时候走了?示例logcat:
07-17 16:27:13.779: I/PROJECTCARUSO(13305): Reminder Set
07-17 16:27:13.789: I/PROJECTCARUSO(13305): Setting Alarm
07-17 16:27:13.789: I/PROJECTCARUSO(13305): ZONE_OFFSET: 15
07-17 16:27:13.789: I/PROJECTCARUSO(13305): sinceMidnight: 77233802
07-17 16:27:13.789: I/PROJECTCARUSO(13305): test now: 21:27:13
07-17 16:27:13.789: I/PROJECTCARUSO(13305): NOW: 77233802
07-17 16:27:13.789: I/PROJECTCARUSO(13305): test send: 16:28:0
07-17 16:27:13.789: I/PROJECTCARUSO(13305): SEND: 59280000
07-17 16:27:13.789: I/PROJECTCARUSO(13305): When it will kick off: 68446198
07-17 16:27:13.979: I/PROJECTCARUSO(13455): onReceive
07-17 16:27:13.989: I/PROJECTCARUSO(13455): Current time: 21:27:14
07-17 16:27:13.989: I/PROJECTCARUSO(13455): Current Mills: 1374096434004
类别:
public class Alarm extends BroadcastReceiver
{
SharedPreferences mPreferences;
Boolean reminder;
String time_selected;
@Override
public void onReceive(Context context, Intent intent)
{
mPreferences = PreferenceManager.getDefaultSharedPreferences(context);
reminder = mPreferences.getBoolean("frequency", false);
time_selected = mPreferences.getString("alarm_time", "");
if (reminder) {
Log.i("PROJECTCARUSO","onReceive");
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "");
wl.acquire();
// Put here YOUR code.
String second =""+ (System.currentTimeMillis()/1000) % 60;
String minute =""+ (System.currentTimeMillis() / (1000 * 60)) % 60;
String hour = ""+ (System.currentTimeMillis() / (1000 * 60 * 60)) % 24;
String time=hour+":"+minute+":"+second;
Log.i("PROJECTCARUSO", "Current time: " + time);
Log.i("PROJECTCARUSO","Current Mills: " + System.currentTimeMillis());
Toast.makeText(context, "Alarm !!!!!!!!!!", Toast.LENGTH_LONG).show(); // For example
wl.release();
} else {
CancelAlarm(context);
}
}
public void SetAlarm(Context context)
{
mPreferences = PreferenceManager.getDefaultSharedPreferences(context);
reminder = mPreferences.getBoolean("frequency", false);
time_selected = mPreferences.getString("alarm_time", "");
if (reminder) {
Log.i("PROJECTCARUSO","Setting Alarm");
AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent i = new Intent(context, Alarm.class);
PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0);
// time selected from settings information
String[] separated = time_selected.split(":");
long timeSelectedMillis = (Long.parseLong(separated[0]) *3600000) + (Long.parseLong(separated[1]) *60000);
Log.i("PROJECTCARUSO", "ZONE_OFFSET: " + (Calendar.ZONE_OFFSET));
Calendar rightNow = Calendar.getInstance();
long sinceMidnight = (System.currentTimeMillis()) % (24 * 60 * 60 * 1000);
Log.i("PROJECTCARUSO", "sinceMidnight: " + sinceMidnight);
String second =""+ (sinceMidnight/1000) % 60;
String minute =""+ (sinceMidnight / (1000 * 60)) % 60;
String hour = ""+ (sinceMidnight / (1000 * 60 * 60)) % 24;
String time=hour+":"+minute+":"+second;
Log.i("PROJECTCARUSO", "test now: " + time);
Log.i("PROJECTCARUSO", "NOW: " + sinceMidnight);
second =""+ (timeSelectedMillis/1000) % 60;
minute =""+ (timeSelectedMillis / (1000 * 60)) % 60;
hour = ""+ (timeSelectedMillis / (1000 * 60 * 60)) % 24;
time=hour+":"+minute+":"+second;
Log.i("PROJECTCARUSO", "test send: " + time);
Log.i("PROJECTCARUSO", "SEND: " + timeSelectedMillis);
long triggerAtMillis = timeSelectedMillis - sinceMidnight;
if (triggerAtMillis < 0) {
triggerAtMillis = (86400000 - sinceMidnight) + timeSelectedMillis;
}
//System.currentTimeMillis()
Log.i("PROJECTCARUSO", "When it will kick off: " + triggerAtMillis);
am.setRepeating(AlarmManager.ELAPSED_REALTIME, triggerAtMillis, 86400000, pi); // Millisec * Second * Minute
} else {
CancelAlarm(context);
}
}
public void CancelAlarm(Context context)
{
mPreferences = PreferenceManager.getDefaultSharedPreferences(context);
reminder = mPreferences.getBoolean("frequency", false);
time_selected = mPreferences.getString("alarm_time", "");
if (reminder) {
Log.i("PROJECTCARUSO","CancelAlarm");
Intent intent = new Intent(context, Alarm.class);
PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, 0);
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
alarmManager.cancel(sender);
}
}
}
答案 0 :(得分:1)
这是警报代码的更改。它目前有效,据我所知也可以。
public void SetAlarm(Context context)
{
mPreferences = PreferenceManager.getDefaultSharedPreferences(context);
reminder = mPreferences.getBoolean("frequency", false);
time_selected = mPreferences.getString("alarm_time", "");
Time now = new Time();
now.setToNow();
if (reminder) {
Log.i("PROJECTCARUSO","Setting Alarm");
AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent i = new Intent(context, Alarm.class);
PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0);
// time selected from settings information
String[] separated = time_selected.split(":");
//Create an offset from the current time in which the alarm will go off.
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(System.currentTimeMillis());
cal.set(Calendar.HOUR_OF_DAY, (int) Long.parseLong(separated[0]));
cal.set(Calendar.MINUTE, (int) Long.parseLong(separated[1]));
Log.i("PROJECTCARUSO", "Time set to go off: " + cal.getTimeInMillis());
am.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 86400000, pi); // Millisec * Second * Minute
} else {
CancelAlarm(context);
}
}
答案 1 :(得分:1)
仅提及“triggerAtMillis”参数的概念:
您必须添加等待当前时间的时间。
例如,以下行在十秒后首先触发Receiver类,并且每20秒重复一次:
am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 10000, 20000, pi);