警报管理器设置重复不等待时间结束

时间:2013-07-17 21:29:01

标签: android alarmmanager

我设置此闹钟在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);
     }
 }
}

2 个答案:

答案 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);