0

Я делаю приложение, которое:Почему BroadcastReceiver инициализируется в прошлый раз?

  1. входы от пользователя времени диапазон ... (Начальное время, Конечное время) предположим, что пользователь дает (06:00 вечера до 07:00 PM)
  2. Когда текущее время телефона равно начального времени, тогда активируется бесшумный режим работы телефона.

Все работает отлично, если диапазон времени в будущем (если мое время телефон перед тем 05:00 PM в описанном выше случае):

  1. позволяет сказать, что мой телефон текущее время телефон 08: 00 PM, и у меня есть временной диапазон от (с 18:00 до 19:00). Затем в мое текущее время (20:00) активируется тихий режим работы телефона. Он должен активировать следующий день ...

Я сделал услугу для этого ...

Всякий раз, когда пользователь вводит диапазон времени он начинает службу OnStart и onStartCommand отменяются ...

public void onStart(Intent intent, int startId) { 
    super.onStart(intent, startId); 

    ArrayList<HashMap<String, String>> arraylist_start = (ArrayList<HashMap<String, String>>) intent.getSerializableExtra("arraylist_start"); 

    if(arraylist_start != null){ 
     try { 
      silentModeOnBroadCastReceiver.startAlarmAt(this, arraylist_start); 
      silentModeOffBroadCastReceiver.startAlarmOff(this, arraylist_start); 
     } catch (ParseException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

в arraylist_start я беру список временных диапазонов от намерения где диапазоны пользователь добавленное время ... То же код записывается в onStartCommand

в SilentModeOnBroadCastReceiver я добавил метод startAlarmAt который та KES что ArrayList и вызовы в ожидании намерения

public void startAlarmAt(Context context, ArrayList<HashMap<String, String>> list) throws ParseException { 
    Calendar calendar = Calendar.getInstance(); 
    for (int j = 0; j < list.size(); j++){ 
     SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); 


     String timeStart = list.get(j).get("timeStart"); 
     date1 = Calendar.getInstance(); 
     date2 = Calendar.getInstance(); 

     date1.setTime(dateFormat.parse(timeStart)); 
     Log.i("Date1Time", date1.toString()); 

     int hours = date1.get(Calendar.HOUR_OF_DAY); 
     int minutes = date1.get(Calendar.MINUTE); 

     calendar.set(Calendar.HOUR_OF_DAY, hours); 
     calendar.set(Calendar.MINUTE, minutes); 
     calendar.set(Calendar.SECOND, 0); 
     calendar.set(Calendar.MILLISECOND, 0); 

     AlarmManager am =(AlarmManager)context.getSystemService(Context.ALARM_SERVICE); 
     Intent i = new Intent(context, SilentModeOnBroadCastReceiver.class); 
     PendingIntent pi = PendingIntent.getBroadcast(context, j, i, PendingIntent.FLAG_UPDATE_CURRENT); 
     am.setRepeating(AlarmManager.RTC_WAKEUP, date1.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pi); 
    } 
} 

Сейчас в SilentModeOnBroadCastReceiver

public void onReceive(Context context, Intent intent) 
{ 
    PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); 
    PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, ""); 
    wl.acquire(); 


    // Put here YOUR code. 
    Toast.makeText(context, "Silent Activated !!!!!!!!!!", Toast.LENGTH_LONG).show(); 
    Silent silent = new Silent(context); 

    silent.activateAudioMode(AudioManager.RINGER_MODE_SILENT); 

    wl.release(); 
} 

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

ответ

1

Причина такого поведения заключается в том, что Android не называет его точным временем (кроме некоторых специальных флагов). Android делает это, чтобы улучшить использование батареи. Это приводит к тому, что Android пытается как можно скорее вызвать этих тревожных слушателей для данного набора свойств. Поскольку ваше временное окно заставляет Android опоздать, чтобы вызвать его, чтобы он делал это лучше всего и называет его почти напрямую.

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

Вы можете добавить один день с помощью этого простого вызова:

if(calendar.before(GregorianCalendar.getInstance())) { 
    calendar.add(Calendar.DAY_OF_MONTH, 1); 
} 
+0

Спасибо за ответ ... Он не работает ... Я добавил его в код –

+0

На самом деле это date1, который я устанавливаю. Повторяю ... Его время должно быть увеличено на один день ... Правильно? –

+0

Я добавил этот код в метод startAlarmAt(). Но все еще не работает? –

1

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

Поместите эту проверку перед настройкой тревоги:

if(alarm_time_in_ms < System.getCurrentTimeMillis()) 
{ 
    calendar.add(Calendar.DAY_OF_MONTH, 1); 
} 

Надеется, что это помогает!

+0

Должен ли я добавить его в broadcastReceiver? Или на службе? –

+0

На службе, перед методом setRepeating(). – NightFury

1

Что бы это ни было, это получение текущего времени и установка тревоги для этого. Что я думаю вам нужно сделать, это получить текущее время (сейчас) и получить время будильника (alarm_time). Вам нужно будет рассматривайте дни также при настройке, потому что если пользователь устанавливает будильник_time = 06: 00AM и теперь 12:46 вечера, вам нужно добавить день к тревоге.

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