【问题标题】:Why alarms does not raise on time?为什么警报没有按时响起?
【发布时间】:2016-05-20 23:59:54
【问题描述】:

我正在我的应用程序中设置闹钟。我为此使用了警报管理器和广播接收器。问题是警报没有按时发出。

有时它会按时加注,有时则不加注。如果设置了多个闹钟,则所有闹钟同时响起。

我尝试使用 setInexactRepeating、setRepeating,这两种情况都是这样发生的。我希望闹钟每周重复一次。

不知道怎么回事请帮忙

通知功能

public void setNotificationTime(Calendar c)
{

    Date dateFrom = new Date();
    df = new SimpleDateFormat("E MMM dd hh:mm:ss zzzz yyyy");
    try {
        dateFrom = df.parse(startTime);
    }
    catch (ParseException ex) {

    }

    dateFrom.getTime();
    c.setTime(dateFrom);

    hour = c.get(Calendar.HOUR_OF_DAY);
    minute = c.get(Calendar.MINUTE);


    if(notificationTime.equals("10 Minutes Before"))
    {


        c.set(Calendar.HOUR_OF_DAY, hour);
        c.set(Calendar.MINUTE, minute - 10);
        c.set(Calendar.SECOND, 0);
        c.set(Calendar.MILLISECOND, 0);
        c.set(Calendar.DATE, day);
        // c.set(Calendar.DAY_OF_WEEK,);

        SetDay(c);

        notification = c.getTime();
        notificationTime = df.format(notification);

        Toast.makeText(getApplicationContext(),notificationTime,Toast.LENGTH_SHORT).show();

        intent = new Intent(getBaseContext(),NotificationReceiver.class);
        pendingIntent = PendingIntent.getBroadcast(getBaseContext(),RQS_1, intent, 0);
        alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
        alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), AlarmManager.INTERVAL_DAY * 7, pendingIntent);

    }



    else if(notificationTime.equals("30 Minutes Before"))
    {

        c.set(Calendar.HOUR_OF_DAY, hour);
        c.set(Calendar.MINUTE, minute - 30);
        c.set(Calendar.SECOND, 0);
        c.set(Calendar.MILLISECOND, 0);
        c.set(Calendar.DATE, day);
        // c.set(Calendar.DAY_OF_WEEK,);

        SetDay(c);

        notification = c.getTime();
        notificationTime = df.format(notification);

        Toast.makeText(getApplicationContext(),notificationTime,Toast.LENGTH_SHORT).show();

        intent = new Intent(getBaseContext(),NotificationReceiver.class);
        pendingIntent = PendingIntent.getBroadcast(getBaseContext(),RQS_1, intent, 0);
        alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
        alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), AlarmManager.INTERVAL_DAY * 7, pendingIntent);

    }



    else if(notificationTime.equals("1 Hour Before"))
    {

        c.set(Calendar.HOUR_OF_DAY, hour - 1);
        c.set(Calendar.MINUTE, minute);
        c.set(Calendar.SECOND, 0);
        c.set(Calendar.MILLISECOND, 0);
        c.set(Calendar.DATE, day);
        // c.set(Calendar.DAY_OF_WEEK,);

        SetDay(c);

        notification = c.getTime();
        notificationTime = df.format(notification);

        Toast.makeText(getApplicationContext(),notificationTime,Toast.LENGTH_SHORT).show();

        intent = new Intent(getBaseContext(),NotificationReceiver.class);
        pendingIntent = PendingIntent.getBroadcast(getBaseContext(),RQS_1, intent, 0);
        alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
        alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), AlarmManager.INTERVAL_DAY * 7, pendingIntent);

    }



    else if(notificationTime.equals("2 Hours Before"))
    {

        c.set(Calendar.HOUR_OF_DAY, hour - 2);
        c.set(Calendar.MINUTE, minute);
        c.set(Calendar.SECOND, 0);
        c.set(Calendar.MILLISECOND, 0);
        c.set(Calendar.DATE, day);
        // c.set(Calendar.DAY_OF_WEEK,);

        SetDay(c);

        notification = c.getTime();
        notificationTime = df.format(notification);

        Toast.makeText(getApplicationContext(),notificationTime,Toast.LENGTH_SHORT).show();

        intent = new Intent(getBaseContext(),NotificationReceiver.class);
        pendingIntent = PendingIntent.getBroadcast(getBaseContext(),RQS_1, intent, 0);
        alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
        alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), AlarmManager.INTERVAL_DAY * 7, pendingIntent);

    }
}

通知接收器

 public class NotificationReceiver  extends BroadcastReceiver {


    public static int MY_NOTIFICATION_ID = 0;
    NotificationManager notificationManager;
    Notification myNotification;

    EventTableHelper db;

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


        Toast.makeText(context, "Time is set", Toast.LENGTH_LONG).show();

        db = new EventTableHelper(context);

        List<EventData> testSavings = db.getAllEvents();

        for (EventData ts : testSavings) {
            String log = "from date:" + ts.getFromDate()
                    + " ,to date: " + ts.getToDate()
                    + " ,location: " + ts.getLocation()
                    + " ,title " + ts.getTitle();

            Calendar c = Calendar.getInstance();
            Date date = new Date();
            Date date1 = new Date();
            Log.d("Result: ", log);

            SimpleDateFormat df = new SimpleDateFormat("E MMM dd hh:mm:ss zzzz yyyy");
            SimpleDateFormat df2 = new SimpleDateFormat("hh:mm a");

            try {
                date = df.parse(ts.getFromDate());
                date1 = df.parse(ts.getToDate());
            } catch (ParseException ex) {

            }
            String timeFrom = df2.format(date);
         //   String startTime = String.valueOf(timeFrom);

            String timeTo = df2.format(date1);
           // String endTime = String.valueOf(timeTo);


            String location = ts.getLocation();
            String title = ts.getTitle();


            Intent myIntent = new Intent(context, MainActivity.class);
            PendingIntent pendingIntent = PendingIntent.getActivity(
                    context,
                    0,
                    myIntent,
                    PendingIntent.FLAG_UPDATE_CURRENT);

            if(location.equals(""))
            {
                String msg = "From : " + timeFrom + "\nTo : " + timeTo;

                myNotification = new NotificationCompat.Builder(context)
                        .setContentTitle("Event : " + title)
                        .setContentText(msg)
                        .setWhen(System.currentTimeMillis())
                        .setContentIntent(pendingIntent)
                        .setAutoCancel(true)
                        .setSmallIcon(R.drawable.eventicon)
                        .setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION))
                        .setStyle(new NotificationCompat.BigTextStyle().bigText(msg))
                        .setDefaults(Notification.DEFAULT_SOUND)
                        .build();

            }

            else
            {
                String msg = "From : " + timeFrom + "\nTo : " + timeTo + "\nAt : " + location;
                myNotification = new NotificationCompat.Builder(context)
                        .setContentTitle("Event : " + title)
                        .setContentText(msg)
                        .setWhen(System.currentTimeMillis())
                        .setContentIntent(pendingIntent)
                        .setAutoCancel(true)
                        .setSmallIcon(R.drawable.eventicon)
                        .setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION))
                        .setStyle(new NotificationCompat.BigTextStyle().bigText(msg))
                        .setDefaults(Notification.DEFAULT_SOUND)
                        .build();

            }

            Log.i("Notify", "Notification");
            notificationManager =
                    (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
            notificationManager.notify(MY_NOTIFICATION_ID, myNotification);

            myNotification.flags=Notification.FLAG_AUTO_CANCEL;

            Intent i = new Intent();
            i.putExtra("notificationId",MY_NOTIFICATION_ID);

            MY_NOTIFICATION_ID ++;

        }
    }
}

谁能帮忙..

【问题讨论】:

    标签: android broadcastreceiver android-notifications alarm raise


    【解决方案1】:

    您是否针对 4.4+ 设备上的 API 级别 19+?如果是这样,则无法安排精确的重复事件。见AlarmManager.setRepeating()

    注意:从 API 19 开始,所有重复警报都是不准确的。如果你的 应用程序需要精确的交付时间,那么它必须使用一次性 准确的警报,每次重新安排如上所述。遗产 targetSdkVersion 早于 API 19 的应用程序将 继续有他们所有的警报,包括重复警报, 被视为精确。

    我认为这是设计使然,以劝阻开发人员:唤醒设备会更快耗尽电池。

    【讨论】:

    • 是的,我已经读过了。但为什么有时所有警报会同时响起?这是同样的原因,还是我在代码中弄错了什么?
    • 我能做些什么来避免这个不准确的时间? @bwt
    • 不精确的警报允许设备唤醒一次并处理多个警报。在 19 岁以上,您可以使用 setExact() 并自己处理重复,即安排下周的每次。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-02
    • 1970-01-01
    • 2014-06-10
    • 1970-01-01
    相关资源
    最近更新 更多