2016-11-11 78 views
0

我有闹钟管理器的问题。我试图在特定的时间设置启动警报,但设置时间后2秒内启动警报。 这里是我的设置报警代码:无法正确启动闹钟管理器的时间

//setting alarm by clicking "add alarm" 
     addAlarm.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       //initializing alert dialog with time picker 
       final AlertDialog.Builder alert = new AlertDialog.Builder(Events.this); 
       final TimePicker timer = new TimePicker(Events.this); 
       alert.setMessage(R.string.choose_time); 
       alert.setTitle(R.string.set_alarm); 
       alert.setView(timer); 
       alert.setPositiveButton("Apply", new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialog, int which) { 
         //getting set time 
         int hour = timer.getHour(); 
         int minute = timer.getMinute(); 
         //getting alarm service 
         AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
         //creating intent for switching to AlarmReceiver.class 
         Intent intent = new Intent(Events.this, AlarmReceiver.class); 
         SimpleDateFormat formatter = new SimpleDateFormat("dd-mm-yyyy"); 
         //getting full date with hours and minutes 
         String alarmTime = selectedDate + " " + hour + ":" + minute; 
         //parsing date 
         try { 
          alarmDate = formatter.parse(alarmTime); 
         } catch (ParseException e) { 
          e.printStackTrace(); 
         } 
         //creating pending intent 
         PendingIntent pendingIntent = PendingIntent.getBroadcast(Events.this, 
           8452, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
         //setting alarm 
         alarmManager.set(RTC_WAKEUP,alarmDate.getTime(), pendingIntent); 
         //info about time set 
         Snackbar.make(bottomRL, "Alarm set in " + hour + ":" + minute, 
           Snackbar.LENGTH_LONG).show(); 
        } 
       }); 
       alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int whichButton) { 
        } 
       }); 
       alert.show(); 
      } 
     }); 

这是我的接收机:

public class AlarmReceiver extends BroadcastReceiver { 
    public AlarmReceiver() { 
    } 

    @Override 
    public void onReceive(Context context, Intent intent) { 
      Toast.makeText(context, R.string.alarm_message, Toast.LENGTH_LONG).show(); 
      Vibrator vibrator = (Vibrator)context.getSystemService(Context.VIBRATOR_SERVICE); 
      vibrator.vibrate(2000); 
    } 
} 

任何人可以帮助我解决问题,请?

+0

String selectedDate是我从getStringExtra从另一个活动获得的字符串 –

+1

“SimpleDateFormat”的模式字符串不符合你的要求试图解析它,所以它抛出一个异常,'alarmDate'留在你初始化它的任何东西。这显然是过去的一个日期/时间,所以你的警报几乎立即发射。查看'SimpleDateFormat'的文档,并修复你的模式。 http://developer.android.com/reference/java/text/SimpleDateFormat.html –

+1

我已经将SimpleDateFormat更改为“dd-MM-yyyy HH:mm”,它的工作原理!非常感谢Mike M. –

回答

0

那是因为从API 19开始警报传递不准确,请参阅here。为了节省电池,操作系统会将警报同时转移到多个触发点。如果你真的想设置你的报警精确到第二,你可以使用alarmManager.setExact()