重复警报在Android中不起作用

时间:2015-10-30 06:35:48

标签: android notifications

用户可以设置自己的重复间隔,例如他/她选择5分钟以提醒她设置的新目标。提醒将从目标的开始日期开始,该日期也由用户设置。

设置目标并设置重复间隔没问题。问题是它不会工作。

我想要发生什么:这是一个例子

目标1明天开始。用户将在明天每1小时收到一次目标1的提醒。

这是我的代码:

public void setReminder(){
        List<Goals> oneGoal = dbhandler.getLatestGoal(goal_id);

        for (final Goals goals : oneGoal) {

            if (repeat.isChecked()) {
                long futureInMillis = 0;
                dbhandler.updateReminders("true",choiceNumber,choiceRepeat,goal_id);

                Calendar cal = Calendar.getInstance();
                cal.setTimeInMillis(System.currentTimeMillis());
                cal.set(Calendar.DATE,Integer.parseInt(goals.getSDay()));  //1-31
                cal.set(Calendar.MONTH,Integer.parseInt(goals.getSMonth())-1);  //first month is 0!!! January is zero!!!
                cal.set(Calendar.YEAR, Integer.parseInt(goals.getSYear()));//year...

                //assigned a unique id to notifications
                Random random = new Random();
                int m = random.nextInt(9999 - 1000) + 1000;

                //Create a new PendingIntent and add it to the AlarmManager
                Intent intent3 = new Intent(this, TimeAlarm.class);
                intent3.putExtra("goalid", Integer.toString(goal_id));
                PendingIntent pendingIntent = PendingIntent.getActivity(this,
                        goals.getGoalId(), intent3, PendingIntent.FLAG_CANCEL_CURRENT);
                AlarmManager am =
                        (AlarmManager) getSystemService(Activity.ALARM_SERVICE);

                if (choiceRepeat.equalsIgnoreCase("Seconds")) {

                am.setRepeating(AlarmManager.RTC_WAKEUP, SystemClock.elapsedRealtime(), 1000 * choiceNumber,
                        pendingIntent);
            } else if (choiceRepeat.equalsIgnoreCase("Minutes")) {
                am.setRepeating(AlarmManager.RTC_WAKEUP, SystemClock.elapsedRealtime(), 1000 * 60 * choiceNumber,
                        pendingIntent);

            } else if (choiceRepeat.equalsIgnoreCase("Hours")) {

                am.setRepeating(AlarmManager.RTC_WAKEUP, SystemClock.elapsedRealtime(), 1000 * 60 * 60 * choiceNumber,
                        pendingIntent);
            }

                MessageTo.message(SetReminderActivity.this, "You will be reminded every "+choiceNumber+" "+choiceRepeat+" for the new goal.");

                //am.cancel(pendingIntent);
            }else{
                MessageTo.message(SetReminderActivity.this, "You've chosen not to set reminder for the new goal.");
            }
        }
    }

TimeAlarm.java //用于通知

public class TimeAlarm extends BroadcastReceiver {

        NotificationManager nm;
        MyDBAdapter dbhandler;

    @Override
        public void onReceive(Context context, Intent intent) {

            int goal_id = Integer.parseInt(intent.getStringExtra("goalid"));


            Uri soundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

            PendingIntent contentIntent = PendingIntent.getActivity(context, 0,
                    new Intent(), 0);

            //assigned a unique id to notifications
            Random random = new Random();
            int m = random.nextInt(9999 - 1000) + 1000;

            List<Goals> oneGoal = dbhandler.getLatestGoal(goal_id);

            for (final Goals goals : oneGoal) {

                Notification mNotification = new Notification.Builder(context)
                        .setContentTitle("A Reminder from GSO")
                        .setContentText(goals.getGoalName())
                        .setSubText(goals.getStartDate() + " - " + goals.getEndDate())
                        .setSmallIcon(R.drawable.gsoicon)
                        .setContentIntent(contentIntent)
                        .setSound(soundUri)
                        .build();

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

                // If you want to hide the notification after it was selected, do the code below
                mNotification.flags |= Notification.FLAG_AUTO_CANCEL;

                nm.notify(m, mNotification);


            }

        }
    }
Android Manifest中的

<receiver android:name=".TimeAlarm" />

我无法说出我的代码有什么问题。 PLS。帮助

2 个答案:

答案 0 :(得分:0)

您只能使用AlarmManager的set()方法设置闹钟。您应该使用setRepeating()方法重复警报事件。

所以,你的下线

am.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, futureInMillis, pendingIntent);

应替换为

am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, futureInMillis, pendingIntent);

您也可以参考此Example : Create Repeating Alarm

每两分钟重复一次事件的示例

 AlarmManager am = (AlarmManager)getSystemService(Activity.ALARM_SERVICE);
 am.setRepeating(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime(),2*60*60,pendingIntent);

答案 1 :(得分:0)

您必须在AndroidManifest.xml中声明接收器

<receiver android:name="TimeAlarm" >

请参阅:http://developer.android.com/guide/topics/manifest/receiver-element.html