1

Я устанавливаю будильник в своем приложении. Для этого я использовал диспетчер аварийной сигнализации и широковещательный приемник. Проблема заключается в том, что будильник не срабатывает вовремя.Почему сигналы тревоги не срабатывают вовремя?

Иногда он делает рейз вовремя, а иногда и нет. Если установлено несколько аварийных сигналов, все тревоги одновременно поднимаются.

Я попытался использовать 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); 

    } 
} 

NotificationReceiver

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 ++; 

     } 
    } 
} 

Может кто-нибудь, пожалуйста, помогите ..

ответ

1

ли вы целевой уровень API 19+ на устройстве 4.4 и выше? Если да, то нет способа запланировать точное повторяющееся событие. См AlarmManager.setRepeating():

Примечание: по API 19, все повторяющиеся сигналы являются неточными. Если ваше приложение нуждается в точном сроке доставки, оно должно использовать одноразовые точные аварийные сигналы , пересматривая каждый раз, как описано выше. Legacy приложения, чья targetSdkVersion ранее API 19 будет , продолжают иметь все свои аварийные сигналы, включая повторяющиеся сигналы тревоги, считаются точными.

Я думаю, что это по дизайну, чтобы разубедить разработчиков: пробуждение устройства разряжает аккумулятор быстрее.

+0

Да, я прочитал это. Но почему все тревоги иногда возникают одновременно? Это одна и та же причина для этого или если я что-то ошибаюсь в своем коде? – user5881997

+0

Что я могу сделать, чтобы избежать этого неточного времени? @bwt – user5881997

+0

Неточные сигналы тревоги позволяют устройствам разбудить один раз и обработать мультипликационные сигналы. В 19+ вы можете использовать 'setExact()' и обрабатывать повтор самостоятельно, т. Е. Планировать каждый раз на следующей неделе. – bwt

Смежные вопросы