3 个不同时间的警报管理器,第二个在第一个触发时触发而不是在指定时间触发ANDROID STUDIO

如何解决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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?