Android,如何取消闹钟? AlarmManager.cancel 不起作用

2024-02-10

我有一个应用程序,您可以在其中创建 5 个警报,其中要创建的警报显示在 ListView 中,并假设当 listView 的元素播放警报时,但应从列表视图中删除该项目,但警报会被删除以始终达到预定时间声音。 我已经查看了很多有关如何删除警报的教程和指南,但没有一个对我有帮助。 要删除,我所做的是将每个警报的 ID 保存在 SQLite 数据库中,当我给出警报消除时,我所做的是将要消除的警报的 ID 提供给 PendingIntent.getBroadcast 以删除您的警报想要但它没有发生。 有人可以检查我的代码并告诉我是否有任何错误,这样警报就不会消除。 谢谢

我用这个方法来创建警报

public void agregarAlarma(Calendar targetCal){
    final int _id = ((int)System.currentTimeMillis()/1000);
    Random generator = new Random();
    DbHelper helper = new DbHelper(this);
    SQLiteDatabase bd = helper.getWritableDatabase();

    int id_nuevo = (_id + generator.nextInt());
    if(alarma.getSelectedItem().toString().equals("Desayuno")){
        comida = alarma.getSelectedItem().toString() + " " + targetCal.getTime().toString();
        descripcion = "del desayuno";
    }else if(alarma.getSelectedItem().toString().equals("Primera Merienda")){
        comida = alarma.getSelectedItem().toString() + " " + targetCal.getTime().toString();
        descripcion = "de la primera merienda";
    }else if(alarma.getSelectedItem().toString().equals("Almuerzo")){
        comida = alarma.getSelectedItem().toString() + " " + targetCal.getTime().toString();
        descripcion = "del almuerzo";
    }else if(alarma.getSelectedItem().toString().equals("Segunda Merienda")){
        comida = alarma.getSelectedItem().toString() + " " + targetCal.getTime().toString();
        descripcion = "de la segunda merienda";
    } else if(alarma.getSelectedItem().toString().equals("Cena")){
        comida = alarma.getSelectedItem().toString() + " " + targetCal.getTime().toString();
        descripcion = "de la cena";

    }

    Intent intent;
    PendingIntent pendingIntent;
    AlarmManager alarmManager;

    if(tablaVacia()>= 5){
         Toast.makeText(this,"Esta lista solo permite 5 alarmas, elimine alguna para crear otra nueva",Toast.LENGTH_SHORT).show();
    }else{
         intent  = new Intent(Recordatorios2.this, AlarmReceiver.class);
        intent.putExtra("Comida",comida);
         pendingIntent = PendingIntent.getBroadcast(Recordatorios2.this, id_nuevo ,intent, PendingIntent.FLAG_ONE_SHOT);
         alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
        alarmManager.set(AlarmManager.RTC_WAKEUP, targetCal.getTimeInMillis(), pendingIntent);
        descripcionTotal = "Alarma  " + descripcion  + " creada "+ targetCal.getTime().toString();
        Toast.makeText(this,descripcionTotal,Toast.LENGTH_SHORT).show();
        ContentValues valores = new ContentValues();
        valores.put("Descripcion",comida);
        valores.put("Identificador",id_nuevo);
        bd.insert("Alarmas",null,valores);
        llenarListaAlarmas1();
    }



}

这填充了listView

    public void llenarListaAlarmas1(){
    listaAlarmas = (ListView)findViewById(R.id.listAlarma);
    lista.clear();
    DbHelper helper = new DbHelper(this);
    SQLiteDatabase bd = helper.getWritableDatabase();

    Cursor c = bd.rawQuery(CONSULTA_ALARMAS,null);

    if(c.moveToFirst()){
        do{
            alarmaDatos = new AlarmaDatos(c.getString(0),null);
            lista.add(alarmaDatos);
        }while (c.moveToNext());
    }
    final ArrayAdapter<AlarmaDatos> adapter1 = new ArrayAdapter<AlarmaDatos>(getApplicationContext(),android.R.layout.simple_list_item_1,lista);
    adapter1.notifyDataSetChanged();
    listaAlarmas.setAdapter(adapter1);
    adapter1.notifyDataSetChanged();

    listaAlarmas.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView adapterView, View view, int position, long id) {

            switch (position){


                case 0:
                    seleccion = adapter1.getItem(position).toString();
                    eliminarAlarma();
                    adapter1.notifyDataSetChanged();
                    lista.remove(position);

                    break;
                case 1:
                    seleccion = adapter1.getItem(position).toString();
                    eliminarAlarma();
                    adapter1.notifyDataSetChanged();
                    lista.remove(position);
                    break;

                case 2:
                    seleccion = adapter1.getItem(position).toString();
                    eliminarAlarma();
                    adapter1.notifyDataSetChanged();
                    lista.remove(position);
                    break;
                case 3:
                    seleccion = adapter1.getItem(position).toString();
                    eliminarAlarma();
                    adapter1.notifyDataSetChanged();
                    lista.remove(position);
                    break;
                case 4:
                    seleccion = adapter1.getItem(position).toString();
                    eliminarAlarma();
                    adapter1.notifyDataSetChanged();
                    lista.remove(position);
                    break;
            }


        }
    });

    }

这是用来消除警报的一个

                public void eliminarAlarma(){
                DbHelper helper = new DbHelper(getApplicationContext());
                SQLiteDatabase bd = helper.getWritableDatabase();
                int identificador =0;
                String CONSULTA_ID = "SELECT Identificador FROM Alarmas WHERE Alarmas.Descripcion = '" + seleccion + "';" ;
                Cursor cursor = bd.rawQuery(CONSULTA_ID,null);
                if(cursor.moveToFirst()){
                    do{
                        alarmaDatos = new AlarmaDatos(cursor.getString(0),null);
                        identificador = Integer.parseInt(alarmaDatos.toString());

                    }while (cursor.moveToNext());
                }
                Intent intent  = new Intent(getBaseContext(), AlarmReceiver.class);

                PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), identificador ,intent,0);
                AlarmManager alarmManager = (AlarmManager)getSystemService(getApplicationContext().ALARM_SERVICE);
                alarmManager.cancel(pendingIntent);
                pendingIntent.cancel();
                borrar(identificador);
                Toast.makeText(getApplicationContext(),"Alarma eliminada",Toast.LENGTH_SHORT).show();

            }

有人可以帮我解决这个问题吗,因为事实并不是因为如果一切看起来都很好就可以消除警报。

TKS


无需打电话pendingIntent.cancel();,所以去掉那条线。

此外,PendingIntent 的构造应与您调度 AlarmManager 时的构造完全相同。

从文档来看,如果满足以下条件,则两个 Intent 被视为相等:

它们的操作、数据、类型、类和类别是相同的。这不会比较意图中包含的任何额外数据。

所以它会是这样的:

 Intent intent  = new Intent(getBaseContext(), AlarmReceiver.class);
 PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), identificador , intent, PendingIntent.FLAG_NO_CREATE);
 AlarmManager alarmManager = (AlarmManager)getSystemService(getApplicationContext().ALARM_SERVICE);
 alarmManager.cancel(pendingIntent);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android,如何取消闹钟? AlarmManager.cancel 不起作用 的相关文章

  • Android - 保存动态更改布局的状态

    我有一个布局 用户可以在其中添加按钮并将其放置在他们想要的位置 我想允许用户保存他们的布局 以便下次打开应用程序时加载它 有谁知道我是否可以将文件保存到 SD 卡上 或者 我可以使用某种layout getXml 方法并将其放入我的应用程序
  • getItem 与 getItemAtPosition

    有两种方法可以获取列表视图中的选定项目 list getAdapter getItem position list getItemAtPosition position 我的问题是 哪一种是首选的做法 我见过人们同时使用这两种方法 您可以使
  • GCM 向主题发送消息:TOO_MANY_TOPICS 错误

    以前 GCM 每个应用程序有 100 万个主题订阅的限制 我发现他们现在已经取消了这一限制 基于发布 订阅模型 主题消息支持 每个应用程序无限订阅 https developers google com cloud messaging to
  • Android - 如何一次只允许播放一个 MediaPlayer 实例?

    我正在尝试创建一个简单的 Sound board Android 应用程序 使用 ListView 项目作为按钮 顺便说一句 我是一个新手程序员 我的想法是 我按下一个按钮 就会播放一个特定的声音文件 如果我在播放声音时按下任何按钮 它应该
  • Android SoundPool 堆限制

    我正在使用 SoundPool 加载多个声音剪辑并播放它们 据我所知 它的功能 100 正确 但在 load 调用期间 我的日志中充斥着以下内容 06 09 11 30 26 110 ERROR AudioCache 23363 Heap
  • 如何更新 Firebase 中的节点密钥?

    如何重命名14 04 2017 node 没有用于重命名节点的 API 您必须获取节点的值 使用新名称将其保存到数据库并删除旧节点
  • 接近语法错误(代码1)插入Android SQLite

    我正在创建一个通讯录应用程序 用户可以在其中输入姓名 电子邮件地址和号码 我希望将此数据保存在数据库中 但我似乎无法使插入方法起作用 我收到的错误是 android database sqlite SQLiteException near
  • 如何查找 Android 设备中的所有文件并将它们放入列表中?

    我正在寻求帮助来列出 Android 外部存储设备中的所有文件 我想查找所有文件夹 包括主文件夹的子文件夹 有办法吗 我已经做了一个基本的工作 但我仍然没有得到想要的结果 这不起作用 这是我的代码 File files array file
  • TextView 之间有分隔线

    我正在尝试在 android studio 中创建以下布局 因为我对 android 东西还很陌生 所以我第一次尝试使用 LinearLayout 并认为这可能无法实现 现在我正在尝试使用RelativeLayout 我已经用颜色创建了这个
  • 更新到材质 1.2.0 后,材质按钮上缺少圆角半径属性

    这是我的材质按钮代码
  • OnClick 事件中的 finish() 如何工作?

    我有一个Activity一键退出Activity 通过layout xml我必须设置OnClick事件至cmd exit调用 this finish 效果很好 public void cmd exit View editLayout thi
  • 从 Firebase 数据库填充微调器

    public class MainActivity extends AppCompatActivity DatabaseReference reference Spinner areaSpinner ArrayList
  • Android 版 Robotium - solo.searchText () 不起作用

    我在使用 Robotium 时遇到 searchText 函数问题 我正在寻找这个字符串
  • Android相机意图:如何获取全尺寸照片?

    我正在使用意图来启动相机 Intent cameraIntent new Intent android provider MediaStore ACTION IMAGE CAPTURE getParent startActivityForR
  • 调节麦克风录音音量

    我们正在尝试调整录音时的音量级别 麦克风似乎非常敏感 会接收到很多静电 我们查看了 setVolumeControlStream 但找不到传入其中来控制麦克风的流 将您的音频源设置为 MIC using MediaRecorder Audi
  • 在 Android 上按下电源按钮时,如何防止先调用 onDestroy() 再调用 onCreate()

    我正在记录每个 onCreate 和 onDestroy 调用 我发现 一旦我单击 Android 上的电源按钮 以及模拟器上的电源按钮 我的活动中就会拨打电话 gt onDestroy gt onCreate 这会杀死我的游戏 然后立即从
  • Android:有没有办法以毫安为单位获取设备的电池容量?

    我想获取设备的电池容量来进行一些电池消耗计算 是否可以以某种方式获取它 例如 三星 Galaxy Note 2 的电池容量为 3100mAh 谢谢你的帮助 知道了 在 SDK 中无法直接找到任何内容 但可以使用反射来完成 这是工作代码 pu
  • Android 如何聚焦当前位置

    您好 我有一个 Android 应用程序 可以在谷歌地图上找到您的位置 但是当我启动该应用程序时 它从非洲开始 而不是在我当前的城市 国家 位置等 我已经在developer android com上检查了信息与位置问题有关 但问题仍然存在
  • 在 Android 中,如何将字符串从 Activity 传递到 Service?

    任何人都可以告诉如何将字符串或整数从活动传递到服务 我试图传递一个整数 setpossition 4 但它不需要 启动时总是需要 0 Service 我不知道为什么我不能通过使用 Service 实例从 Activity 进行操作 publ
  • 无法将 admob 与 firebase iOS/Android 项目链接

    我有两个帐户 A 和 B A 是在 Firebase 上托管 iOS Android unity 手机游戏的主帐户 B 用于将 admob 集成到 iOS Android 手机游戏中 我在尝试将 admob 分析链接到 Firebase 项

随机推荐