Использование NotificationManager с AlarmService для планирования уведомлений deivce pu sh по дате и времени получения от пользователя - PullRequest
0 голосов
/ 03 апреля 2020

Я пытаюсь запланировать уведомления с использованием службы тревоги и ожидающего намерения, каждый раз, когда пользователь вводит новое задание, он передает ожидающее намерение методу OnRecive диспетчера уведомлений, но проблема, с которой я сталкиваюсь, заключается в том, что пользователь не При планировании нескольких уведомлений показывается последнее запланированное уведомление, которое перезаписывает предыдущие объекты, хотя я передаю новый идентификатор каждому уведомлению.

Вот код, в который пользователь будет добавлять задачу.

import android.app.AlarmManager;
import android.app.DatePickerDialog;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.TimePickerDialog;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.CompoundButton;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.Switch;
import android.widget.TimePicker;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import androidx.constraintlayout.widget.ConstraintLayout;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;


public class AddTask extends AppCompatActivity {
    int mDay, mMonth, mYear, hourofDay, minutes;
    EditText selectDate, selectTime, tastText;
    Switch showReminder;
    ConstraintLayout remiderLayout;
    Button save;
    TaskDBHelper taskDBHelper;
    ReminderReciver reminderReciver;
    boolean activityResult;

    @RequiresApi(api = Build.VERSION_CODES.O)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_add_task);
        createNotificationChannel();
        final Calendar c = Calendar.getInstance();
        mYear = c.get(Calendar.YEAR);
        mMonth = c.get(Calendar.MONTH);
        mDay = c.get(Calendar.DAY_OF_MONTH);
        hourofDay = c.get(Calendar.HOUR_OF_DAY);
        minutes = c.get(Calendar.MINUTE);
        selectDate = findViewById(R.id.selectDate);
        selectDate.setFocusable(false);
        selectTime = findViewById(R.id.selectTime);
        selectTime.setFocusable(false);
        showReminder = findViewById(R.id.reminderSwitch);
        remiderLayout = findViewById(R.id.showReminderLayout);
        save = findViewById(R.id.AddTaskButton);
        tastText = findViewById(R.id.tastTextbox);
        showReminder.toggle();
        showReminder.setOnCheckedChangeListener((buttonView, isChecked) -> {
            if(showReminder.isChecked()){
                remiderLayout.setVisibility(View.VISIBLE);
            }
            else{
                remiderLayout.setVisibility(View.INVISIBLE);
            }
        });
        selectDate.setOnClickListener(v -> ShowDatePicker());
        selectTime.setOnClickListener(v -> ShowTimePicker());
        save.setOnClickListener(v -> {
            taskDBHelper = new TaskDBHelper(AddTask.this);
            if(showReminder.isChecked()){
                activityResult = taskDBHelper.addTask(tastText.getText().toString(),
                        selectDate.getText().toString(), selectTime.getText().toString());
            }
            else{
                activityResult = taskDBHelper.addNote(tastText.getText().toString(),
                        selectDate.getText().toString(), selectTime.getText().toString());
            }

            String itemCount = getIntent().getStringExtra("Itemcount");
            Intent notif = new Intent(AddTask.this, ReminderReciver.class);
            notif.setAction("com.example.Broadcast");
            notif.putExtra("notificationText", tastText.getText().toString());
            Log.d("Text", tastText.getText().toString());
            notif.putExtra("notificationID", itemCount);
            PendingIntent pendingIntent = PendingIntent.getBroadcast(AddTask.this,0,notif,0);

            IntentFilter intentFilter = new IntentFilter("com.example.Broadcast");
            reminderReciver = new ReminderReciver();
            registerReceiver(reminderReciver,intentFilter);

            Calendar myAlarmDate = Calendar.getInstance();
            myAlarmDate.setTimeInMillis(System.currentTimeMillis());
            myAlarmDate.set(mYear, mMonth, mDay, hourofDay, minutes);

            AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
            alarmManager.set(AlarmManager.RTC_WAKEUP,myAlarmDate.getTimeInMillis(),pendingIntent);

            finish();
        });
    }

    @RequiresApi(api = Build.VERSION_CODES.O)
    public void createNotificationChannel(){
        CharSequence channelName = "Reminders";
        String description = "Channel for reminders";
        int importance = NotificationManager.IMPORTANCE_DEFAULT;
        NotificationChannel channel = new NotificationChannel("Reminders", channelName, importance);
        channel.setDescription(description);
        NotificationManager notificationManager = getSystemService(NotificationManager.class);
        notificationManager.createNotificationChannel(channel);
    }

    public void ShowDatePicker(){
        DatePickerDialog datePickerDialog = new DatePickerDialog(this, new DatePickerDialog.OnDateSetListener() {
            @Override
            public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
                selectDate.setText(dayOfMonth + "-" + (monthOfYear + 1) + "-" + year);
                mDay = dayOfMonth;
                mMonth = monthOfYear;
                mYear = year;
            }
        }, mYear, mMonth, mDay);
        datePickerDialog.show();
    }

    public void ShowTimePicker(){
        TimePickerDialog timePickerDialog = new TimePickerDialog(this, new TimePickerDialog.OnTimeSetListener() {
            @Override
            public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
                selectTime.setText(hourOfDay+" : "+minute);
                hourofDay = hourOfDay;
                minutes = minute;
            }
        }, hourofDay, minutes,true);
        timePickerDialog.show();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(reminderReciver);
    }
}

Это приемник вещания

package com.birdicomputers.login;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import androidx.core.app.NotificationCompat;
import androidx.core.app.NotificationManagerCompat;

public class ReminderReciver extends BroadcastReceiver {

    private String NotificationTitle;
    private String NotificationText;
    private String Notification_ID;

    public ReminderReciver() {
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        NotificationText = intent.getStringExtra("notificationText");
        Notification_ID = intent.getStringExtra("notificationID");
        Log.d("NotifText", NotificationText);
        NotificationCompat.Builder builder = new NotificationCompat.Builder(context, "Reminders")
                .setSmallIcon(R.drawable.ic_menu_send)
                .setContentTitle("Due Now!")
                .setContentText(NotificationText)
                .setPriority(NotificationCompat.PRIORITY_DEFAULT);
        NotificationManagerCompat notificationManagerCompat = NotificationManagerCompat.from(context);
        notificationManagerCompat.notify(Integer.parseInt(Notification_ID), builder.build());
    }
}
...