2014-11-12 4 views
0

Updateсигнализация не срабатывает в определенный момент времени

обслуживание Сигнализация не попадающего на на выбранную дату и время.

add_task_frag (фрагмент, который вызывает тревогу):

Intent intent = new Intent(getActivity(), AlarmReceiver.class); 
PendingIntent pendingIntent = PendingIntent.getService(getActivity(), 0, intent, 0); 
AlarmManager am = (AlarmManager)getActivity().getSystemService(Context.ALARM_SERVICE); 
am.set(AlarmManager.RTC_WAKEUP, 5000, pendingIntent); 

Сигнализация должна идти через 5 секунд, но этого не происходит. если я ставлю этот код (для отложенного умысла)

PendingIntent pendingIntent = PendingIntent.getActivity(getActivity(), 0, intent, 0); 

затем сигнал идет сразу же после нажатия кнопки, а не после 5 секунд.

Ниже тревоги класс приемника:

super.onCreate(savedInstanceState); 
    PowerManager powerManager = (PowerManager)getSystemService(Context.POWER_SERVICE); 
    wakeLock = powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK, "My Wake Lock"); 
    wakeLock.acquire(); 
    this.requestWindowFeature(Window.FEATURE_NO_TITLE); 
    this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON, 
      WindowManager.LayoutParams.FLAG_FULLSCREEN | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); 
    setContentView(R.layout.alarm); 

    Button stopalarm = (Button)findViewById(R.id.stop); 
    stopalarm.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      mediaPlayer.stop(); 
      finish(); 
     } 
    }); 
    playSound (this, getAlarmUri()); 
} 
private void playSound (Context context, Uri alert){ 
    mediaPlayer = new MediaPlayer(); 
    try{ 
     mediaPlayer.setDataSource(context, alert); 
     final AudioManager audioManager = (AudioManager)context.getSystemService(AUDIO_SERVICE); 
     if (audioManager.getStreamVolume(AudioManager.STREAM_ALARM) != 0){ 
      mediaPlayer.setAudioStreamType(AudioManager.STREAM_ALARM); 
      mediaPlayer.prepare(); 
      mediaPlayer.start(); 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
private Uri getAlarmUri(){ 
    Uri alert = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM); 
    if (alert == null){ 
     alert = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 
     if (alert == null){ 
      RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE); 
     } 
    } 
    return alert; 
} 

@Override 
protected void onStop() { 
    super.onStop(); 
    wakeLock.release(); 
} 

ответ

2

triggerAtMillis аргумент set метод - это время срабатывания сигнализации. Если это меньше, чем текущее время, тогда будильник будет немедленно запущен. Таким образом, вы допустили ошибку, это должно быть System.currentTimeMillis() + 5000 вместо 5000.

3

Это единственное изменение должно сделать работу:

am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 5000, pendingIntent); 

RTC предполагает, вы обеспечиваете UTC метку времени, так как oposed к ELAPSED_REALTIME, который ожидает, что время с момента загрузки.

+0

Примечание о RTC действительно помогло. – LadyWoodi

0

Тревога срабатывает мгновенно. Необходимо указать дополнительное время. Кроме того, код в порядке.

1

Что нужно сделать, чтобы будильник вызывал в течение 5000 миллисекунд. (это ничего не значит, или может быть, это означает после 5000 миллисекунд с момента появления Земли).

U необходимо выполнить System.currentTimeMillis() + 5000