android 中固定日期和时间的警报管理器

Alarm manager in a fixed date and time in android

我想构建一个 android 应用程序,它会在固定的日期和时间给我闹钟。对于日期,我使用日期选择器和时间选择器在文本字段中抽取时间。我已经通过关注合并了以毫秒为单位的日期和时间。

public void mergedt(){
    String myDate = textDate.getText().toString();
    String myTime = textTime.getText().toString();
    String toParse = myDate + " " + myTime;
    // viewtext.setText(toParse + " ");
    try {
        SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy hh:mm");
        Date date = formatter.parse(toParse);
        millis = date.getTime();
        viewtext.setText(millis + "");
        //viewtext.setText(date + "");
    } catch (ParseException pe) {
        pe.printStackTrace();
    }
}

我已经在

之后以毫秒为单位转换了当前日期和时间
long milliseconds = new GregorianCalendar().getTimeInMillis();

为了设置闹钟,我使用了以下代码

public void setAlarm(View view){
    long interval = millis - milliseconds;
    long time = new GregorianCalendar().getTimeInMillis() + interval;

    Intent intent = new Intent(this,AlarmReceiver.class);
    AlarmManager alarm_Manager = (AlarmManager)  getSystemService(Context.ALARM_SERVICE);
    alarm_Manager.set(AlarmManager.RTC_WAKEUP,time, PendingIntent.getBroadcast(this, 1,intent, PendingIntent.FLAG_UPDATE_CURRENT));
}

当我设置闹钟时,它会立即显示消息 "alarming" 它不会在固定的日期和时间显示闹钟。代码有什么问题,我该如何解决?

试试这个:在你的 mergedt()

try {
    SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy hh:mm a");
    Date date = formatter.parse(toParse);
    // millis = date.getTime();
    Calendar calender_alarm.setTime(date);
    millis=calender_alarm.getTimeInMillis();
    viewtext.setText(millis + "");
    //viewtext.setText(date + "");
} catch (ParseException pe) {
    pe.printStackTrace();

}

获取您的当前时间:

    Calendar calNow = Calendar.getInstance();
   long current_time = calNow.getTimeInMillis();

现在查看闹钟时间:

     if (millis > current_time) {
        //call setAlarm() method
 }

在您的 setAlarm() 方法中更改:

alarm_Manager.set(AlarmManager.RTC_WAKEUP,time, PendingIntent.getBroadcast(this, 1,intent, PendingIntent.FLAG_UPDATE_CURRENT));

至:

alarm_Manager.set(AlarmManager.RTC_WAKEUP,millis, PendingIntent.getBroadcast(this, 1,intent, PendingIntent.FLAG_UPDATE_CURRENT));

将时间值更改为毫秒

您正在尝试从选择器中获取日期和时间值,因此您可以使用此 class。获取时间和日期并设置闹钟。

public class MainActivity extends AppCompatActivity {


public static int alarmHour, alarmMin, alarmDay, alarmYear, alarmMonth;
final static int RQS_1 = 1;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}

public void setDate(View view) {
    DialogFragment newFragment = new DatePickerFragment();
    newFragment.show(getSupportFragmentManager(), "datePicker");
}

public void setTime(View view) {

    DialogFragment newFragment = new TimePickerFragment();
    newFragment.show(getSupportFragmentManager(), "timePicker");
}


public void setAlarm(View view) {
    Calendar calNow = Calendar.getInstance();
    Calendar calSet = (Calendar) calNow.clone();
    calSet.set(Calendar.HOUR_OF_DAY, alarmHour);
    calSet.set(Calendar.MINUTE, alarmMin);
    calSet.set(Calendar.DAY_OF_MONTH, alarmDay);
    calSet.set(Calendar.YEAR, alarmYear);
    calSet.set(Calendar.MONTH, alarmMonth);

    setAlarmN(calSet);
}

private void setAlarmN(Calendar targetCal) {

    Toast.makeText(this, "Alarm is set at" + targetCal.getTime(),
            Toast.LENGTH_LONG).show();
    Intent intent = new Intent(getBaseContext(), AlarmReceiver.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(
            getBaseContext(), RQS_1, intent, 0);
    AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    alarmManager.set(AlarmManager.RTC_WAKEUP, targetCal.getTimeInMillis(),
            pendingIntent);

}

//date picker fragment
public static class DatePickerFragment extends DialogFragment
        implements DatePickerDialog.OnDateSetListener {

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        // Use the current date as the default date in the picker
        final Calendar c = Calendar.getInstance();
        int year = c.get(Calendar.YEAR);
        int month = c.get(Calendar.MONTH);
        int day = c.get(Calendar.DAY_OF_MONTH);

        // Create a new instance of DatePickerDialog and return it
        return new DatePickerDialog(getActivity(), this, year, month, day);
    }

    public void onDateSet(DatePicker view, int year, int month, int day) {
        // Do something with the date chosen by the user
        alarmDay = day;
        alarmYear = year;
        alarmMonth = month;
    }
}

//Time picker fragment 
public static class TimePickerFragment extends DialogFragment
        implements TimePickerDialog.OnTimeSetListener {
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        // Use the current time as the default values for the picker
        final Calendar c = Calendar.getInstance();
        int hour = c.get(Calendar.HOUR_OF_DAY);
        int minute = c.get(Calendar.MINUTE);

        // Create a new instance of TimePickerDialog and return it
        return new TimePickerDialog(getActivity(), this, hour, minute,
                DateFormat.is24HourFormat(getActivity()));
    }

    public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
        // Do something with the time chosen by the user
        alarmHour = hourOfDay;
        alarmMin = minute;
    }
}


}

完整项目link:https://github.com/milon87/AlarmSpecificTime