如何解决3 个不同时间的警报管理器,第二个在第一个触发时触发而不是在指定时间触发ANDROID STUDIO
所以我正在制作出生日期提醒应用程序,对于我制作的每个出生日期,我设置了 3 个闹钟管理器在特定时间触发(我选择我的分钟和小时进行测试),所以我让 weekAlarm 可以在 8:00 和我的dayBeforeAlarm 在 8:01 和我的 onDatealarm 在 8:02,所以 weekAlarm 应该在 8 和 dayBeforeAlarm 应该在 8:01 触发等等......,所以当我制作一个生日时它很好并且它工作得很好但是当我做超过一个 BirthDate 每当第一个 AlarmManager(weekAlarm) 被触发时,AlarmManagers 就会触发,所以如果我有 2 个 BirthDates 然后一次 weekAlarm 触发,立即 dayBeforeAlarm 触发,如果我有 3 个出生日期,那么一次 weekAlarm 触发,立即 dayBeforeAlarm 和 onDatealarm 触发。 请注意,我指定的所有生日都必须是同一日期。我怎样才能让他们在他们选择的时间开火?
生日制作师班
package com.gavle.birthdatereminder;
import androidx.appcompat.app.AppCompatActivity;
import android.app.AlarmManager;
import android.app.DatePickerDialog;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.Calendar;
public class BirthdateMaker extends AppCompatActivity {
EditText name;
EditText lastName;
TextView date;
String dateSaved;
private DatePickerDialog datePicker;
private DatePickerDialog.OnDateSetListener datePickerOnListener;
Button save;
ArrayList<String> nameList;
ArrayList<String> lastNameList;
ArrayList<String> dateList;
Context context;
int savedYear;
int savedMonth;
int savedDay;
Boolean editing = false;
int position = -1;
int idNumber = 0;
static int weekBeforeID = -1;
static int dayBeforeID = 0;
static int onDateID = 1;
static int notifID = 0;
static ArrayList<Integer> sameDate;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_birthdate_maker);
context = this;
Intent intent = getIntent();
editing = intent.getBooleanExtra("saving",false);
position = intent.getIntExtra("position",-1);
name = findViewById(R.id.name);
lastName = findViewById(R.id.lastName);
date = findViewById(R.id.date);
save = findViewById(R.id.save);
System.out.println("weekBeforeID " + weekBeforeID);
if (position != -1) {
name.setText(MainActivity.nameList.get(position));
if (MainActivity.lastNameList.get(position) != " ") {
lastName.setText(MainActivity.lastNameList.get(position));
}
date.setText(MainActivity.dateList.get(position));
}
if (!name.getText().toString().isEmpty() && !date.getText().toString().isEmpty()) {
save.setEnabled(true);
}
date.setonClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Calendar calendar = Calendar.getInstance();
int year = calendar.get(Calendar.YEAR);
int months = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DAY_OF_MONTH);
System.out.println("date click listener runs :D ");
datePicker = new DatePickerDialog(BirthdateMaker.this,android.R.style.Theme_Holo_Dialog_NoActionBar_MinWidth,datePickerOnListener,year,months,day);
datePicker.show();
datePicker.getDatePicker().setMaxDate(System.currentTimeMillis());
datePicker.getwindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
}
});
datePickerOnListener = new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view,int year,int month,int dayOfMonth) {
month = month + 1;
String formattedDate = month + "/" + dayOfMonth + "/" + year;
System.out.println("date runs :D");
savedYear = year;
savedMonth = month;
savedDay = dayOfMonth;
date.setText(formattedDate);
}
};
TextWatcher textWatcher = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s,int start,int count,int after) {
}
@Override
public void onTextChanged(CharSequence s,int before,int count) {
String nameInput = name.getText().toString().trim();
String lastNameInput = lastName.getText().toString().trim();
String dateInput = date.getText().toString();
save.setEnabled(!nameInput.isEmpty() && !dateInput.equals("Date Of Birth"));
if (save.isEnabled()) {
dateSaved = dateInput;
}
}
@Override
public void afterTextChanged(Editable s) {
}
};
name.addTextChangedListener(textWatcher);
lastName.addTextChangedListener(textWatcher);
date.addTextChangedListener(textWatcher);
save.setonClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (editing == false) {
nameList = new ArrayList<>();
lastNameList = new ArrayList<>();
dateList = new ArrayList<>();
String savedname = name.getText().toString();
String savedLastName = lastName.getText().toString();
if (savedLastName.isEmpty()) {
savedLastName = " ";
}
setNotifications(savedYear,savedMonth,savedDay,dateSaved);
MainActivity.nameList.add(savedname);
MainActivity.lastNameList.add(savedLastName);
MainActivity.dateList.add(dateSaved);
MainActivity.setAdapter();
datePicker.dismiss();
} else {
String savedname = name.getText().toString();
String savedLastName = lastName.getText().toString();
String savedDate = date.getText().toString();
if (savedLastName.isEmpty()) {
savedLastName = " ";
}
MainActivity.nameList.set(position,savedname);
MainActivity.lastNameList.set(position,savedLastName);
MainActivity.dateList.set(position,savedDate);
MainActivity.setAdapter();
}
System.out.println("name List " + nameList);
finish();
}
});
}
public void setNotifications(int year,int day,String dateSaved){
if(year != -1 && month != -1 && day != -1){
month = month - 1;
if(MainActivity.nameList.isEmpty()){
System.out.println("empty name list runs ");
setWeekBefore(year,month,day,false);
setDayBefore(year,false);
setonDate(year,false);
}
else{
boolean isThereSameDate = checkSameDate(dateSaved);
System.out.println("is there same date = " + isThereSameDate);
if(!isThereSameDate){
System.out.println("if part runs false");
setWeekBefore(year,false);
setDayBefore(year,false);
setonDate(year,false);
}
else{
System.out.println("else part runs true");
setWeekBefore(year,true);
setDayBefore(year,true);
setonDate(year,true);
}
}
}
}
public void setWeekBefore(int year,boolean isSameDate){
System.out.println("week alarm went off");
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR,year);
calendar.set(Calendar.MONTH,month);
calendar.set(Calendar.DAY_OF_MONTH,day);
calendar.set(Calendar.AM_PM,Calendar.PM);
calendar.set(Calendar.HOUR,9);
calendar.set(Calendar.MINUTE,46);
calendar.set(Calendar.SECOND,0);
System.out.println("is same date in methods " + isSameDate);
Intent weekIntent = new Intent(this,NotificationMaker.class);
System.out.println("week before ID " + weekBeforeID);
weekIntent.putExtra("isSameDate",isSameDate);
PendingIntent weekPendingIntent = PendingIntent.getbroadcast(this,setWeekBeforeID(),weekIntent,0);
AlarmManager weekAlarm = (AlarmManager) getSystemService(context.ALARM_SERVICE);
weekAlarm.setExact(AlarmManager.RTC_WAKEUP,calendar.getTimeInMillis(),weekPendingIntent);
}
public void setDayBefore(int year,boolean isSameDate){
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR,47);
calendar.set(Calendar.SECOND,0);
System.out.println("is same date in methods " + isSameDate);
System.out.println("day before ID " + dayBeforeID);
Intent dayBeforeIntent = new Intent(context,NotificationMaker.class);
dayBeforeIntent.putExtra("isSameDate",isSameDate);
PendingIntent dayBeforePendingIntent = PendingIntent.getbroadcast(context,setDayBeforeID(),dayBeforeIntent,0);
AlarmManager dayBeforeAlarm = (AlarmManager) getSystemService(context.ALARM_SERVICE);
dayBeforeAlarm.setExact(AlarmManager.RTC_WAKEUP,dayBeforePendingIntent);
System.out.println("calendar in day before " + calendar.getTimeInMillis() + " and " + calendar.getTime());
}
public void setonDate(int year,48);
calendar.set(Calendar.SECOND,0);
System.out.println("is same date in methods " + isSameDate);
System.out.println("on date ID " + onDateID);
Intent onDateIntent = new Intent(context,NotificationMaker.class);
onDateIntent.putExtra("isSameDate",isSameDate);
PendingIntent onDatePendingIntent = PendingIntent.getbroadcast(context,setonDateID(),onDateIntent,0);
AlarmManager onDatealarm = (AlarmManager) getSystemService(context.ALARM_SERVICE);
onDatealarm.setExact(AlarmManager.RTC_WAKEUP,onDatePendingIntent);
}
public int setWeekBeforeID(){
weekBeforeID = weekBeforeID + 1;
return weekBeforeID;
}
public int setDayBeforeID(){
dayBeforeID = dayBeforeID + 1;
return dayBeforeID;
}
public int setonDateID(){
onDateID = onDateID + 1;
return onDateID;
}
@Override
public void onBackpressed() {
super.onBackpressed();
}
public boolean checkSameDate(String dateSaved) {
ArrayList<String> dateList = MainActivity.dateList;
sameDate = new ArrayList<>();
for (int i = 0; i < dateList.size(); i++) {
if (dateSaved.equals(dateList.get(i))) {
sameDate.add(i);
}
}
/* for(int z = 0; z < sameDate.size(); z++){
for(int g = z + 1; g < sameDate.size(); g++){
if(sameDate.get(z).equals(sameDate.get(g))){
sameDate.remove(g);
}
}
}*/
System.out.println(sameDate + "same date");
if (!sameDate.isEmpty()) {
return true;
} else {
return false;
}
}
}
onRecieve 类
package com.gavle.birthdatereminder;
import android.app.Notification;
import android.content.broadcastReceiver;
import android.content.Context;
import android.content.Intent;
import androidx.core.app.NotificationCompat;
import androidx.core.app.notificationmanagerCompat;
import static com.gavle.birthdatereminder.NotificationChannels.channelID;
public class NotificationMaker extends broadcastReceiver {
static int number = -1;
static boolean isSameDate;
@Override
public void onReceive(Context context,Intent intent) {
int ID = numberID();
System.out.println("ID count " + ID);
isSameDate = intent.getBooleanExtra("isSameDate",false);
System.out.println("IsSameDate" + isSameDate);
Notification notification = new NotificationCompat.Builder(context,channelID)
.setSmallIcon(R.drawable.ic_baseline_add_24)
.setContentTitle("title")
.setContentText(String.valueOf(ID))
.build();
MainActivity.notificationmanager.notify(ID,notification);
// System.out.println("in on receieve" + BirthdateMaker.sameDate.get(BirthdateMaker.sameDate.size() - 1));
}
public int numberID() {
if (isSameDate == true) {
int ID = BirthdateMaker.sameDate.get(BirthdateMaker.sameDate.size() - 1);
System.out.println("ID ID gets called");
return ID;
} else {
number = number + 1;
int ID = number;
System.out.println("number number gets called");
return ID;
}
}
}
解决方法
您需要使每个 PendingIntent
独一无二,否则您只需用新的覆盖旧的。您可以使用唯一的 ACTION、requestCode 或 DATA 使您的 PendingIntent
独一无二。在您的情况下,我会将 Intent
中的 ACTION 设置为唯一的字符串(即:“BEFORE-WEEK”、“BEFORE-DAY”、“ON-DAY”)并附加出生日期的字符串表示形式,或者,如果一个生日可能出现多次,您可以改为附加此人的姓名,这样可以确保每个 PendingIntent
都是唯一的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。