在特定时间不触发警报

时间:2014-11-12 15:49:36

标签: android alarmmanager android-pendingintent

更新

警报服务未在指定日期和时间开启。

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

4 个答案:

答案 0 :(得分:3)

这个唯一的改变应该可以完成这项任务:

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

RTC假设您提供UTC时间戳,因为ELAPSED_REALTIME选择了自启动以来的时间。

答案 1 :(得分:2)

triggerAtMillis方法的

set参数是应该触发警报的时间。如果它小于当前时间,则立即触发警报。因此,您犯了一个错误,它应该是System.currentTimeMillis() + 5000,而不仅仅是5000

答案 2 :(得分:1)

你要做的是要求警报在5000毫秒时触发。 (这并不意味着任何事情,或者可能意味着在地球诞生之后的5000毫秒之后)。

你需要做System.currentTimeMillis()+ 5000

答案 3 :(得分:0)

警报将立即触发。您需要指定一些额外的时间。除此之外,代码还可以。