如何使用 AlarmManager 设置一些警报?

How to set some alarms using AlarmManager?

我正在为 Android 制作警报应用程序。我想使用 AlarmManager 设置更多警报。我该怎么做?据我所知,我需要使用具有不同请求代码的 PendingIntent 来设置一些警报。我试图增加一个静态变量并且我做到了但是如果用户重新加载应用程序该变量的请求代码为零。如何在重新加载我的应用程序后设置一些警报?

我有一个activity

public class NewAlarmActivity extends AppCompatActivity {
private Calendar calendar;

private static int REQUEST_CODE_ALARM = 0;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_new_alarm);

    showTimePickerDialog();

    FloatingActionButton floatingActionButton = findViewById(R.id.fb_save_alarm);
    floatingActionButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            saveAlarm();
        }
    });
}

// set time for an alarm
private void showTimePickerDialog() {
    calendar = Calendar.getInstance();

    TimePickerDialog timePickerDialog = new TimePickerDialog(NewAlarmActivity.this, AlertDialog.THEME_DEVICE_DEFAULT_DARK, new TimePickerDialog.OnTimeSetListener() {
        @Override
        public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
            calendar.set(Calendar.HOUR_OF_DAY, hourOfDay);
            calendar.set(Calendar.MINUTE, minute);
        }
    }, Calendar.HOUR_OF_DAY, Calendar.MINUTE, true);

    timePickerDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
        @Override
        public void onCancel(DialogInterface dialog) {
            finish();
        }
    });

    timePickerDialog.show();
}

// get full time like a '05:45'
private String getFullTime(int hour, int minute) {
    String h = String.valueOf(hour);
    String m = String.valueOf(minute);

    if (hour < 10) h = "0" + hour;
    if (minute < 10) m = "0" + minute;

    return h + ":" + m;
}

private void saveAlarm() {
    setAlarm();
    insertIntoSQLite();
    finish();
}

private void setAlarm() {
    Intent intent = new Intent(NewAlarmActivity.this, AlarmReceiver.class);
    intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), ++REQUEST_CODE_ALARM, intent, PendingIntent.FLAG_UPDATE_CURRENT);

    AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    if (alarmManager != null) {
        alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
    }
}

private void insertIntoSQLite() {
    DBHelper dbHelper = new DBHelper(NewAlarmActivity.this);
    SQLiteDatabase database = dbHelper.getWritableDatabase();

    ContentValues contentValues = new ContentValues();
    contentValues.put("time", getFullTime(calendar.get(Calendar.HOUR_OF_DAY), calendar.get(Calendar.MINUTE)));
    contentValues.put("description", et_description.getText().toString());

    database.insert("alarm", null, contentValues);

    dbHelper.close();
    }
}

您可以将小数据保存到sharedPreference。 要保存您的 REQUEST_CODE_ALARM 值,请执行此操作

SharedPreferences.Editor editor = getSharedPreferences(MY_PREFS_NAME, MODE_PRIVATE).edit();
editor.putInt("Request_code", REQUEST_CODE_ALARM);
editor.apply()

找回它

SharedPreferences prefs = getSharedPreferences(MY_PREFS_NAME, MODE_PRIVATE); 
int Request_code = prefs.getInt("REQUEST_CODE_ALARM", 0); //0 is the default value.

我不建议您为此目的使用 SQL 数据库,因为 SharedPreferences 对于存储用户首选项很有用,其中只有少数变量需要存储。 SQL另一方面,ite 更适合存储大量项目的数据,例如音乐库中需要搜索的歌曲标题。

警报管理器将不会精确到 api19 以上。 尝试使用 Workmanager。