Alarm Manager设置Repeating不等待时间熄灭



我将此警报设置为在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);
     }
 }
}

这是对报警代码的更改。它目前运行良好,据我所知运行良好。

 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);
     }
 }

仅提及"triggerAtMillis"参数的概念:

您必须将要等待的时间添加到当前时间。

例如,以下行在10秒钟后首先触发Receiver类,并每20秒钟重复一次:

 am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 10000, 20000, pi);

最新更新