java - Android:如何创建多个闹钟并在选择后取消它们

标签 java android alarmmanager android-pendingintent android-broadcastreceiver

我想创建一些具有不同时间的闹钟,并在选择每个闹钟时将它们一一取消。我可以创建几个警报。但我不知道如何在选择时取消它们。

目前,警报取消过程正在针对我设置的最后一个警报进行。

这是我的作品,

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.app.TimePickerDialog;
import android.content.Context;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.TimePicker;

import java.util.Calendar;

public class MainActivity extends AppCompatActivity {

    TimePicker myTimePicker;
    Button buttonstartSetDialog;
    Button buttonCancelAlarm;
    TextView textAlarmPrompt;

    Button buttonstartSetDialogOne;
    Button buttonstartSetDialogTwo;
    Button buttonstartSetDialogThree;

    TextView textAlarmPromptOne;
    TextView textAlarmPromptTwo;
    TextView textAlarmPromptThree;

    TimePickerDialog timePickerDialog;

    int RQS_1 = 1;

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

        textAlarmPrompt = (TextView) findViewById(R.id.alarmprompt);
        textAlarmPromptOne = (TextView) findViewById(R.id.alarmpromptOne);
        textAlarmPromptTwo = (TextView) findViewById(R.id.alarmpromptTwo);
        textAlarmPromptThree = (TextView) findViewById(R.id.alarmpromptThree);

        buttonstartSetDialog = (Button) findViewById(R.id.startSetDialog);
        buttonstartSetDialog.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                textAlarmPrompt.setText("");
                openTimePickerDialog(false);

            }
        });

        buttonstartSetDialogOne = (Button) findViewById(R.id.startSetDialogOne);
        buttonstartSetDialogOne.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                RQS_1=2;
                textAlarmPromptOne.setText("");
                openTimePickerDialog(false);

            }
        });

        buttonstartSetDialogTwo=(Button) findViewById(R.id.startSetDialogTwo);
        buttonstartSetDialogTwo.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                RQS_1=3;
                textAlarmPromptTwo.setText("");
                openTimePickerDialog(false);

            }
        });

        buttonstartSetDialogThree=(Button) findViewById(R.id.startSetDialogThree);
        buttonstartSetDialogThree.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                RQS_1=4;
                textAlarmPromptThree.setText("");
                openTimePickerDialog(false);

            }
        });


        buttonCancelAlarm = (Button) findViewById(R.id.cancel);
        buttonCancelAlarm.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View arg0) {
                cancelAlarm(RQS_1);
            }
        });
    }

    private void openTimePickerDialog(boolean is24r) {
        Calendar calendar = Calendar.getInstance();

        timePickerDialog = new TimePickerDialog(
                MainActivity.this,
                onTimeSetListener,
                calendar.get(Calendar.HOUR_OF_DAY),
                calendar.get(Calendar.MINUTE),
                is24r);
        timePickerDialog.setTitle("Set Alarm Time");

        timePickerDialog.show();

    }

    TimePickerDialog.OnTimeSetListener onTimeSetListener
            = new TimePickerDialog.OnTimeSetListener() {

        @Override
        public void onTimeSet(TimePicker view, int hourOfDay, int minute) {

            Calendar calNow = Calendar.getInstance();
            Calendar calSet = (Calendar) calNow.clone();

            calSet.set(Calendar.HOUR_OF_DAY, hourOfDay);
            calSet.set(Calendar.MINUTE, minute);
            calSet.set(Calendar.SECOND, 0);
            calSet.set(Calendar.MILLISECOND, 0);

            if (calSet.compareTo(calNow) <= 0) {
                //Today Set time passed, count to tomorrow
                calSet.add(Calendar.DATE, 1);
            }

            setAlarm(calSet,RQS_1);
        }
    };

    private void setAlarm(Calendar targetCal,int RQS) {

        if(RQS==1){
            textAlarmPrompt.setText(
                    "\n\n***\n"
                            + "Alarm is set@ " + targetCal.getTime() + "\n"
                            + "***\n");

            Intent intent = new Intent(getBaseContext(), AlarmReceiver.class);
            PendingIntent pendingIntent = PendingIntent.getBroadcast(getBaseContext(), RQS, intent, 0);
            AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
            alarmManager.set(AlarmManager.RTC_WAKEUP, targetCal.getTimeInMillis(), pendingIntent);
        }else if(RQS==2){
            textAlarmPromptOne.setText(
                    "\n\n***\n"
                            + "Alarm is set@ " + targetCal.getTime() + "\n"
                            + "***\n");

            Intent intent = new Intent(getBaseContext(), AlarmReceiver.class);
            PendingIntent pendingIntent = PendingIntent.getBroadcast(getBaseContext(), RQS, intent, 0);
            AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
            alarmManager.set(AlarmManager.RTC_WAKEUP, targetCal.getTimeInMillis(), pendingIntent);
        }else if(RQS==3){
            textAlarmPromptTwo.setText(
                    "\n\n***\n"
                            + "Alarm is set@ " + targetCal.getTime() + "\n"
                            + "***\n");

            Intent intent = new Intent(getBaseContext(), AlarmReceiver.class);
            PendingIntent pendingIntent = PendingIntent.getBroadcast(getBaseContext(), RQS, intent, 0);
            AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
            alarmManager.set(AlarmManager.RTC_WAKEUP, targetCal.getTimeInMillis(), pendingIntent);
        }else if(RQS==4){
            textAlarmPromptThree.setText(
                    "\n\n***\n"
                            + "Alarm is set@ " + targetCal.getTime() + "\n"
                            + "***\n");

            Intent intent = new Intent(getBaseContext(), AlarmReceiver.class);
            PendingIntent pendingIntent = PendingIntent.getBroadcast(getBaseContext(), RQS, intent, 0);
            AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
            alarmManager.set(AlarmManager.RTC_WAKEUP, targetCal.getTimeInMillis(), pendingIntent);
        }

    }

    private void cancelAlarm(int RSQ) {

        if(RSQ==1){
            textAlarmPrompt.setText(
                    "\n\n***\n"
                            + "Alarm Cancelled! \n"
                            + "***\n");

            Intent intent = new Intent(getBaseContext(), AlarmReceiver.class);
            PendingIntent pendingIntent = PendingIntent.getBroadcast(getBaseContext(), RSQ, intent, 0);
            AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
            alarmManager.cancel(pendingIntent);
        }else if(RSQ==2){
            textAlarmPromptOne.setText(
                    "\n\n***\n"
                            + "Alarm Cancelled! \n"
                            + "***\n");

            Intent intent = new Intent(getBaseContext(), AlarmReceiver.class);
            PendingIntent pendingIntent = PendingIntent.getBroadcast(getBaseContext(), RSQ, intent, 0);
            AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
            alarmManager.cancel(pendingIntent);
        }else if(RSQ==3){
            textAlarmPromptTwo.setText(
                    "\n\n***\n"
                            + "Alarm Cancelled! \n"
                            + "***\n");

            Intent intent = new Intent(getBaseContext(), AlarmReceiver.class);
            PendingIntent pendingIntent = PendingIntent.getBroadcast(getBaseContext(), RSQ, intent, 0);
            AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
            alarmManager.cancel(pendingIntent);
        }else if(RSQ==4){
            textAlarmPromptThree.setText(
                    "\n\n***\n"
                            + "Alarm Cancelled! \n"
                            + "***\n");

            Intent intent = new Intent(getBaseContext(), AlarmReceiver.class);
            PendingIntent pendingIntent = PendingIntent.getBroadcast(getBaseContext(), RSQ, intent, 0);
            AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
            alarmManager.cancel(pendingIntent);
        }

    }
}

AlarmReceiver.java

import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.media.RingtoneManager;
import android.net.Uri;
import android.widget.Toast;
import android.support.v4.app.NotificationCompat;

/**
 * Created by PC2 on 1/18/2017.
 */

public class AlarmReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "I'm running", Toast.LENGTH_LONG).show();

        NotificationManager notificationManager = (NotificationManager) context
                .getSystemService(Context.NOTIFICATION_SERVICE);

        Intent notificationIntent = new Intent(context, MainActivity.class);
        notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

        PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,
                notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);

        Uri alarmSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);

        NotificationCompat.Builder mNotifyBuilder = new NotificationCompat.Builder(
                context).setSmallIcon(R.mipmap.ic_launcher)
                .setContentTitle("New Alarm")
                .setContentText("Countdown").setSound(alarmSound)
                .setAutoCancel(true)
                .setVibrate(new long[]{1000, 1000, 1000, 1000, 1000});
        notificationManager.notify(0, mNotifyBuilder.build());
    }
}

有什么关于我的问题吗?

最佳答案

代码太多,你的代码似乎工作正常

要取消所有警报,必须一一取消它们,并且需要所有请求代码

private void cancelAlarm(int RSQ) {

            textAlarmPrompt.setText(
                    "\n\n***\n"
                            + "Alarm Cancelled! \n"
                            + "***\n");

            Intent intent = new Intent(getBaseContext(), AlarmReceiver.class);
            PendingIntent pendingIntent = PendingIntent.getBroadcast(getBaseContext(), RSQ, intent, 0);
            AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
            alarmManager.cancel(pendingIntent);
        }

然后使用单独取消每个

cancelAlarm(1);
cancelAlarm(2);
cancelAlarm(3);
cancelAlarm(4);

取消全部

for(int i=1;i<5;i++)
{
  cancelAlarm(i);
}

关于java - Android:如何创建多个闹钟并在选择后取消它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41714408/

相关文章:

testing - 安卓 WebView SSL 'Security Warning'

android - 主进程死后静态变量仍然有效?

java - 在哪里声明用于在环境模式下更新表盘的闹钟管理器?

android - 警报 (RTC_WAKEUP) 后触发 Activity ,但屏幕保持黑屏

java - Android TCP套接字超时

java - 如何使用 If else 语句 java 进行身份验证过滤器

java - 无法在 docker 容器上运行 selenium 测试用例

java - Eclipse热键-快捷方式修改?我的意思是实际的热键命令,而不是键绑定(bind)

java - Android camera2 镜头本征校准

java - 用于计时器的 Android 线程