Android:多个警报不起作用

Posted

技术标签:

【中文标题】Android:多个警报不起作用【英文标题】:Android: Multiple Alarm not working 【发布时间】:2011-12-29 07:19:32 【问题描述】:

在我的应用程序中,我设置了两个闹钟。 在上的工具按钮上,我将使用以下代码进行设置:

case R.id.toggleButtonTwoMonth:
            myPrefs = this.getSharedPreferences("myPrefs",MODE_WORLD_WRITEABLE);
            if (tButtonTwoMonth.isChecked()) 
                Toast.makeText(getApplicationContext(), "Two months reminder is On", Toast.LENGTH_SHORT).show(); 
                prefsEditor = myPrefs.edit(); prefsEditor.putBoolean("TwoMonth", true); prefsEditor.commit(); 

                //For Broadcast Alarm
                Intent in = new Intent(this, AlarmReceiverNotificationForTwoMonth.class);

                alarmManagerForTwoMonth1 = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE);
                alarmManagerForTwoMonth2 = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE);

                pendingIntentOfTwoMonth1 = PendingIntent.getBroadcast(this, 0, in, PendingIntent.FLAG_UPDATE_CURRENT);
                pendingIntentOfTwoMonth2 = PendingIntent.getBroadcast(this, 0, in, PendingIntent.FLAG_UPDATE_CURRENT);
                // ===================== GST ALARM FOR THE TWO MONTHS ==========================

                // for the GST 20 June 2011
                Calendar calendar_GST_18_June_2011 = Calendar.getInstance();
                calendar_GST_18_June_2011.setTimeInMillis(System.currentTimeMillis());
                calendar_GST_18_June_2011.set(2011, 5, 18, mHour, mMinute, 0);
                alarmManagerForTwoMonth1.set(AlarmManager.RTC_WAKEUP,   calendar_GST_18_June_2011.getTimeInMillis(), pendingIntentOfTwoMonth1);

                // for the GST 17 August 2011

                Calendar calendar_GST_17_August_2011 = Calendar.getInstance();
                calendar_GST_17_August_2011.setTimeInMillis(System.currentTimeMillis());
                calendar_GST_17_August_2011.set(2011, 7, 17,mHour, mMinute, 0);
                alarmManagerForTwoMonth2.set(AlarmManager.RTC_WAKEUP,  calendar_GST_17_August_2011.getTimeInMillis(),pendingIntentOfTwoMonth2);


            
            else 
                Toast.makeText(getApplicationContext(), "Two months reminder is Off", Toast.LENGTH_SHORT).show();
                prefsEditor = myPrefs.edit(); prefsEditor.putBoolean("TwoMonth", false); prefsEditor.commit();

                //alarmManagerForTwoMonth.cancel(pendingIntentOfTwoMonth);
            
            break;

但是我在那个希望的时间没有收到 amarm 通知,如果切换是打开的。 现在警报时间过去了,如果我关闭然后再打开,我就会收到警报。

那么我的代码有什么问题? 请帮助我。

已编辑:

有了这个答案,我已经解决了多次设置警报:How can I setup multiple alarms in android?

但我想知道如何处理它。我的意思是如何使用不同的消息处理接收器上的警报?

我更新的带有多个警报的代码如下:

//For Broadcast Alarm
                Intent in = new Intent(this, AlarmReceiverNotificationForTwoMonth.class);

                // ===================== GST ALARM FOR THE TWO MONTHS ==========================

                // for the GST 20 June 2011
                alarmManagerForTwoMonth1 = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE);
                pendingIntentOfTwoMonth1 = PendingIntent.getBroadcast(this, 0, in, PendingIntent.FLAG_UPDATE_CURRENT);
                Calendar calendar_GST_18_June_2011 = Calendar.getInstance();
                calendar_GST_18_June_2011.setTimeInMillis(System.currentTimeMillis());
                calendar_GST_18_June_2011.set(2011, 5, 18, mHour, mMinute, 0);
                alarmManagerForTwoMonth1.set(AlarmManager.RTC_WAKEUP,   calendar_GST_18_June_2011.getTimeInMillis(), pendingIntentOfTwoMonth1);

                // for the GST 17 August 2011
                alarmManagerForTwoMonth2 = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE);
                pendingIntentOfTwoMonth2 = PendingIntent.getBroadcast(this, 1, in, PendingIntent.FLAG_UPDATE_CURRENT);
                Calendar calendar_GST_17_August_2011 = Calendar.getInstance();
                calendar_GST_17_August_2011.setTimeInMillis(System.currentTimeMillis());
                calendar_GST_17_August_2011.set(2011, 7, 17,mHour, mMinute, 0);
                alarmManagerForTwoMonth2.set(AlarmManager.RTC_WAKEUP,  calendar_GST_17_August_2011.getTimeInMillis(),pendingIntentOfTwoMonth2);

接收方的代码如下:

public void onReceive(Context context, Intent intent) 
    // TODO Auto-generated method stub

    // My Notification Code
    notificationManager = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
    int icon = R.drawable.app_icon;

    CharSequence text = "Your tax amount due period";
    CharSequence contentTitle = "Tax Calculator App";
    Calendar cal = Calendar.getInstance();
    cal.setTimeInMillis(System.currentTimeMillis());
    System.out.println("the Date is: "+(cal.getTime().getDate())+" "+ (cal.getTime().getMonth())+" "+  (cal.get(Calendar.YEAR)));

    if((cal.getTime().getDate()==18) && (cal.getTime().getMonth()==5) && (cal.get(Calendar.YEAR)==2011))
        contentText = "Your GST tax amount is due on 20 June 2011";
    
    else if((cal.getTime().getDate()==17) && (cal.getTime().getMonth()==7) && (cal.get(Calendar.YEAR)==2011))
        contentText = "Your GST tax amount is due on 19th August, 2011";
    
    else
        contentText = "Your GST tax amount is due on Falana Dhikna Date";
     

    long when = System.currentTimeMillis();

    intent = new Intent(context, NotificationViewer.class);
    PendingIntent contentIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

    notification = new Notification(icon,text,when);

    long[] vibrate = 0,100,200,300;
    notification.vibrate = vibrate;  // To vibrate the Device

    notification.ledARGB = Color.RED;
    notification.ledOffMS = 300;
    notification.ledOnMS = 300;

    notification.defaults |= Notification.DEFAULT_LIGHTS;
    //notification.flags |= Notification.FLAG_SHOW_LIGHTS;

    notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);
    notificationManager.notify(NotificationConstants.NOTIFICATION_ID, notification);



现在如何处理不同的警报? 帮我解决这个问题。 谢谢。

已编辑

请输入此代码:

case R.id.toggleButtonTwoMonth:
            myPrefs = this.getSharedPreferences("myPrefs",MODE_WORLD_WRITEABLE);
            if (tButtonTwoMonth.isChecked()) 
                Toast.makeText(getApplicationContext(), "Two months reminder is On", Toast.LENGTH_SHORT).show(); 
                prefsEditor = myPrefs.edit(); prefsEditor.putBoolean("TwoMonth", true); prefsEditor.commit(); 

                //For Broadcast Alarm
                //Intent in = new Intent(this, AlarmReceiverNotificationForTwoMonth.class);

                // ===================== GST ALARM FOR THE TWO MONTHS ==========================

                // for the GST 20 June 2011
                AM_2M_GST_1 = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE);
                Intent in1 = new Intent(this, AlarmReceiverNotificationForTwoMonth.class);
                in1.putExtra("MyMessage","Your GST tax is due on 20 June 2011");
                PI_2M_GST_1 = PendingIntent.getBroadcast(this, 0, in1, PendingIntent.FLAG_UPDATE_CURRENT);
                Calendar calendar_GST_18_June_2011 = Calendar.getInstance();
                calendar_GST_18_June_2011.setTimeInMillis(System.currentTimeMillis());
                calendar_GST_18_June_2011.set(2011, 5, 18, mHour, mMinute, 0);
                AM_2M_GST_1.set(AlarmManager.RTC_WAKEUP,   calendar_GST_18_June_2011.getTimeInMillis(), PI_2M_GST_1);

                // for the GST 19 August 2011
                AM_2M_GST_2 = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE);
                Intent in2 = new Intent(this, AlarmReceiverNotificationForTwoMonth.class);
                in2.putExtra("MyMessage","Your GST tax is due on 19 August 2011");
                PI_2M_GST_2 = PendingIntent.getBroadcast(this, 1, in2, PendingIntent.FLAG_UPDATE_CURRENT);
                Calendar calendar_GST_17_August_2011 = Calendar.getInstance();
                calendar_GST_17_August_2011.setTimeInMillis(System.currentTimeMillis());
                calendar_GST_17_August_2011.set(2011, 7, 17,mHour, mMinute, 0);
                AM_2M_GST_2.set(AlarmManager.RTC_WAKEUP,  calendar_GST_17_August_2011.getTimeInMillis(),PI_2M_GST_2);

                // for the GST 19 October 2011  
                AM_2M_GST_3 = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE);
                Intent in3 = new Intent(this, AlarmReceiverNotificationForTwoMonth.class);
                in3.putExtra("MyMessage","Your GST tax is due on 19 October 2011");
                PI_2M_GST_3 = PendingIntent.getBroadcast(this, 2, in3, PendingIntent.FLAG_UPDATE_CURRENT);
                Calendar calendar_GST_19_October_2011 = Calendar.getInstance();
                calendar_GST_19_October_2011.setTimeInMillis(System.currentTimeMillis());
                calendar_GST_19_October_2011.set(2011, 9, 19,mHour, mMinute, 0);
                AM_2M_GST_3.set(AlarmManager.RTC_WAKEUP,  calendar_GST_19_October_2011.getTimeInMillis(),PI_2M_GST_3);

                // for the GST 17 December 2011 
                AM_2M_GST_4 = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE);
                Intent in4 = new Intent(this, AlarmReceiverNotificationForTwoMonth.class);
                in4.putExtra("MyMessage","Your GST tax is due on 17 December 2011");
                PI_2M_GST_4 = PendingIntent.getBroadcast(this, 3, in4, PendingIntent.FLAG_UPDATE_CURRENT);
                Calendar calendar_GST_17_December_2011 = Calendar.getInstance();
                calendar_GST_17_December_2011.setTimeInMillis(System.currentTimeMillis());
                calendar_GST_17_December_2011.set(2011, 11, 17,mHour, mMinute, 0);
                AM_2M_GST_4.set(AlarmManager.RTC_WAKEUP,  calendar_GST_17_December_2011.getTimeInMillis(),PI_2M_GST_4);

                // for the GST 20 February 2012 
                AM_2M_GST_5 = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE);
                Intent in5 = new Intent(this, AlarmReceiverNotificationForTwoMonth.class);
                in5.putExtra("MyMessage","Your GST tax is due on 18 February 2012");
                PI_2M_GST_5 = PendingIntent.getBroadcast(this, 4, in5, PendingIntent.FLAG_UPDATE_CURRENT);
                Calendar calendar_GST_18_February_2012 = Calendar.getInstance();
                calendar_GST_18_February_2012.setTimeInMillis(System.currentTimeMillis());
                calendar_GST_18_February_2012.set(2012, 1, 18,mHour, mMinute, 0);
                AM_2M_GST_5.set(AlarmManager.RTC_WAKEUP,  calendar_GST_18_February_2012.getTimeInMillis(),PI_2M_GST_5);

                // for the GST 27 April 2012    
                AM_2M_GST_6 = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE);
                Intent in6 = new Intent(this, AlarmReceiverNotificationForTwoMonth.class);
                in6.putExtra("MyMessage","Your GST tax is due on 27 April 2012");
                PI_2M_GST_6 = PendingIntent.getBroadcast(this, 5, in6, PendingIntent.FLAG_UPDATE_CURRENT);
                Calendar calendar_GST_27_April_2012 = Calendar.getInstance();
                calendar_GST_27_April_2012.setTimeInMillis(System.currentTimeMillis());
                calendar_GST_27_April_2012.set(2012, 3, 27,mHour, mMinute, 0);
                AM_2M_GST_6.set(AlarmManager.RTC_WAKEUP,  calendar_GST_27_April_2012.getTimeInMillis(),PI_2M_GST_6);

                // ===================== PROVISIONAL ALARM FOR THE TWO MONTHS ==========================

                // for the PROVISIONAL 26 August 2011   
                AM_2M_PROVISIONAL_1 = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE);
                Intent in7 = new Intent(this, AlarmReceiverNotificationForTwoMonth.class);
                in7.putExtra("MyMessage","Your PROVISIONAL tax is due on 26 August 2011");
                PI_2M_PROVISIONAL_1 = PendingIntent.getBroadcast(this, 6, in7, PendingIntent.FLAG_UPDATE_CURRENT);
                Calendar calendar_PROVISIONAL_26_August_2011 = Calendar.getInstance();
                calendar_PROVISIONAL_26_August_2011.setTimeInMillis(System.currentTimeMillis());
                calendar_PROVISIONAL_26_August_2011.set(2011, 7, 26,mHour, mMinute, 0);
                AM_2M_PROVISIONAL_1.set(AlarmManager.RTC_WAKEUP,  calendar_PROVISIONAL_26_August_2011.getTimeInMillis(),PI_2M_PROVISIONAL_1);

                // for the PROVISIONAL 13 January 2012  
                AM_2M_PROVISIONAL_2 = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE);
                Intent in8 = new Intent(this, AlarmReceiverNotificationForTwoMonth.class);
                in8.putExtra("MyMessage","Your PROVISIONAL tax is due on 13 January 2012");
                PI_2M_PROVISIONAL_2 = PendingIntent.getBroadcast(this, 7, in8, PendingIntent.FLAG_UPDATE_CURRENT);
                Calendar calendar_PROVISIONAL_13_January_2012 = Calendar.getInstance();
                calendar_PROVISIONAL_13_January_2012.setTimeInMillis(System.currentTimeMillis());
                calendar_PROVISIONAL_13_January_2012.set(2012, 0, 13,mHour, mMinute, 0);
                AM_2M_PROVISIONAL_2.set(AlarmManager.RTC_WAKEUP, calendar_PROVISIONAL_13_January_2012.getTimeInMillis(),PI_2M_PROVISIONAL_2);

                // for the PROVISIONAL 5 May 2012   
                AM_2M_PROVISIONAL_3 = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE);
                Intent in9 = new Intent(this, AlarmReceiverNotificationForTwoMonth.class);
                in9.putExtra("MyMessage","Your PROVISIONAL tax is due on 5 May 2012");
                PI_2M_PROVISIONAL_3 = PendingIntent.getBroadcast(this, 8, in9, PendingIntent.FLAG_UPDATE_CURRENT);
                Calendar calendar_PROVISIONAL_5_May_2012 = Calendar.getInstance();
                calendar_PROVISIONAL_5_May_2012.setTimeInMillis(System.currentTimeMillis());
                calendar_PROVISIONAL_5_May_2012.set(2012, 4, 5,mHour, mMinute, 0);
                AM_2M_PROVISIONAL_3.set(AlarmManager.RTC_WAKEUP, calendar_PROVISIONAL_5_May_2012.getTimeInMillis(),PI_2M_PROVISIONAL_3);

                // ===================== TERMINAL ALARM FOR THE TWO MONTHS ==========================

                // for the TERMINAL 5 April 2012    
                AM_2M_TERMINAL_1 = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE);
                Intent in10 = new Intent(this, AlarmReceiverNotificationForTwoMonth.class);
                in10.putExtra("MyMessage","Your TERMINAL tax is due on 5 APRIL 2012");
                PI_2M_TERMINAL_1 = PendingIntent.getBroadcast(this, 9, in10, PendingIntent.FLAG_UPDATE_CURRENT);
                Calendar calendar_TERMINAL_5_APRIL_2012 = Calendar.getInstance();
                calendar_TERMINAL_5_APRIL_2012.setTimeInMillis(System.currentTimeMillis());
                calendar_TERMINAL_5_APRIL_2012.set(2012, 3, 5,mHour, mMinute, 0);
                AM_2M_TERMINAL_1.set(AlarmManager.RTC_WAKEUP, calendar_TERMINAL_5_APRIL_2012.getTimeInMillis(),PI_2M_TERMINAL_1);

            
            else 
                Toast.makeText(getApplicationContext(), "Two months reminder is Off", Toast.LENGTH_SHORT).show();
                prefsEditor = myPrefs.edit(); prefsEditor.putBoolean("TwoMonth", false); prefsEditor.commit();

                AM_2M_GST_1.cancel(PI_2M_GST_1);
                AM_2M_GST_2.cancel(PI_2M_GST_2);
                AM_2M_GST_3.cancel(PI_2M_GST_3);
                AM_2M_GST_4.cancel(PI_2M_GST_4);
                AM_2M_GST_5.cancel(PI_2M_GST_5);
                AM_2M_GST_6.cancel(PI_2M_GST_6);
                AM_2M_PROVISIONAL_1.cancel(PI_2M_PROVISIONAL_1);
                AM_2M_PROVISIONAL_2.cancel(PI_2M_PROVISIONAL_2);
                AM_2M_PROVISIONAL_3.cancel(PI_2M_PROVISIONAL_3);
                AM_2M_TERMINAL_1.cancel(PI_2M_TERMINAL_1);

                //alarmManagerForTwoMonth.cancel(pendingIntentOfTwoMonth);
            
            break;

现在。在这里我收到了通知。但我希望它为所有人分开。意味着如果已经存在一个并且如果生成了新的,那么它不应该更新已经存在的,而是应该创建新的单独的。 谢谢。

【问题讨论】:

您使用 sqlite 数据库(内部数据库)保存警报并使用广播接收器获取警报通知。 不,我没有为此使用任何数据库。 . .为什么 ?我应该这样做吗? 请看我更新的问题。 【参考方案1】:

好吧,你为什么不这样做

Intent in = new Intent(this, AlarmReceiverNotificationForTwoMonth.class);
in.putExtra("MyMessage","Your tax is due on blah blah blah");
pendingIntentOfTwoMonth1 = PendingIntent.getBroadcast(this, 0, in, PendingIntent.FLAG_UPDATE_CURRENT);

而在onRecieve

只需从 Intent 中检索消息

public void onReceive(Context context, Intent intent) 

// blah blah
   Toast.show(context,intent.getStringExtra("MyMessage"),Toast.LENGTH_LONG).show();

【讨论】:

好的,如果我将它用于我的代码,那么它会按我的意愿工作吗? 是的,设置闹钟时,使用意图来存储有关事件的数据...在您的广播接收器中,只需从该意图中检索数据(onRecieve 的第二个参数)它是相同的您在设置闹钟时创建的一个 我在意图未解析变量时遇到语法错误 是的,您的代码运行良好。现在,如果我不想更新警报通知并获得自己的每个通知怎么办。我的意思是现在如果已经有任何通知并且如果我收到另一个通知,那么新通知将更新过去的通知。因此,如果我想为所有人单独通知,那我该怎么办? @iDroidExplorer,对每一个使用不同的requestCode,看到PendingIntent.getBroadcast()调用中的0参数?对于每个不同的警报,这应该是不同的。【参考方案2】:

请使用数据库从以下链接尝试我的答案。

AlarmManager with Broadcast Receiver

首先从您的活动中将闹钟时间和日期添加到数据库中,然后创建广播接收器类以从数据库中获取数据。

【讨论】:

所以如果我想为选择日期制作多个警报,那么我必须使用数据库来使用所选日期? 但是如果我使用带有选定日期和时间的 Single Alatm 那么它可以工作,那么为什么其他日期不工作呢? 在内置警报中,如果您使用数据库进行多个警报,从上面的链接为我工作,那么单个警报是有效的。 我只想在不同的日期制作不同的 Alam。 . .有了这个,我可以得到它。 ***.com/questions/3273342/… 我必须为接下来的 17 天设置闹钟,每天设置 4 次。使用单个方法调用同时设置多个警报不起作用,但是通过对未决意图第二个参数使用唯一 id 对我来说效果很好。谢谢。请在这里查看***.com/questions/44858366/…

以上是关于Android:多个警报不起作用的主要内容,如果未能解决你的问题,请参考以下文章

重启后Android警报重置不起作用

JavaScript 警报在 Android WebView 中不起作用

Android 警报管理器 setExactAndAllowWhileIdle() 在打盹模式下的 Android 7.0 Nougat 中不起作用

phonegap javascript警报不起作用?

通知在android中不起作用

接近警报不起作用,我用 google maps api v2 制作了一个简单的 android 应用程序