将NotificationManager与AlarmService一起使用,以通过从用户获取日期和时间来调度推式通知

问题描述 投票:0回答:1

我正在尝试使用警报服务和待定意图来计划通知,每次用户输入新任务时,都会将待定意图传递给通知管理器OnRecive方法,但是我遇到的问题是用户无法计划多个通知,显示最后一个计划的通知,即使我向每个通知传递新的ID,也可以认为覆盖先前的对象。

这里有用户将添加任务的代码。

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());
    }
}
java android push-notification alarmmanager
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.