2017-02-08 9 views
1

Я делаю простой сервис, который каждые 10 минут загружает WebPage (HTML-код) и уведомляет пользователя, если что-то изменилось. Теперь проблема в том, что первые 3-4 уведомления отображаются правильно, но после них существует важная задержка между уведомлениями, и иногда они не поступают. Вот мой код: Monitor.javaПоздние уведомления о фоновой службе

public void onCreate() { 
    super.onCreate(); 

    customHandler = new android.os.Handler(); 
    customHandler.postDelayed(runnable, 0); 


} 

Runnable runnable = new Runnable() { 
    @Override 
    public void run() { 
     RUN = true; 


     LINK = readMessage("ADDR"); 

     Ion.with(getApplicationContext()).load(LINK).asString().setCallback(new FutureCallback<String>() { 
      @Override 
      public void onCompleted(Exception e, String result) { 
       Risultad = result; 

       if (fileExists(getApplicationContext(), "AVV") == false) 

       { 
        Savefile(Risultad, "AVV"); 
        Intent i = new Intent(getApplicationContext(), MainActivity.class); 
        PendingIntent pi = PendingIntent.getActivity(getApplicationContext(), 0, i, 0); 
        NotificationManager notificationManager = (NotificationManager) 
          getSystemService(NOTIFICATION_SERVICE); 
        NotificationCompat.Builder n = new NotificationCompat.Builder(getApplicationContext()) 
          .setContentTitle("First") 
          .setContentText(Risultad.toString()) 
          .setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)) 
          .setVibrate(new long[]{2000}) 
          .setContentIntent(pi) 
          .setAutoCancel(true) 
          .setSmallIcon(android.R.drawable.ic_dialog_email); 
        notificationManager.notify(0, n.build()); 
       } 
       if (fileExists(getApplicationContext(), "AVV") == true) 

       { 
        final String OldAvv = readMessage("AVV"); 


        if (Risultad.equals(OldAvv + "\r\n") == false) { 

         Savefile(result, "AVV"); 
         Intent i = new Intent(getApplicationContext(), MainActivity.class); 
         PendingIntent pi = PendingIntent.getActivity(getApplicationContext(), 0, i, 0); 
         NotificationManager notificationManager = (NotificationManager) 
           getSystemService(NOTIFICATION_SERVICE); 
         NotificationCompat.Builder n = new NotificationCompat.Builder(getApplicationContext()) 
           .setContentTitle("Something happened") 
           .setContentText(result.toString()) 
           .setContentIntent(pi) 
           .setAutoCancel(true) 
           .setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)) 
           .setSmallIcon(android.R.drawable.ic_dialog_email); 
         notificationManager.notify(0, n.build()); 

        } 
       } 


      } 


     }); 
     customHandler.postDelayed(this, 300000); 
    } 

Я использую библиотеку Ion, чтобы загрузить страницу. readMessage, SaveFile и fileExist используются для чтения, сохранения или проверки кода HTML, хранящегося на устройстве.

Иногда уведомления отображаются при открытии приложения.

Что делать, чтобы получать уведомления вовремя?

ответ

0

Посмотрите AlarmManager

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

Примечание. Диспетчер аварийных сигналов предназначен для случаев, когда вы хотите, чтобы ваш код приложения запускался в определенное время, даже если ваше приложение в настоящее время не работает. Для обычных операций синхронизации (тиков, тайм-аутов и т. Д.) Проще использовать Handler.

См this guide для получения дополнительной информации и примеры кода

+0

Да, я видел, но я не понимаю, как использовать его с BroadcastReceiver на ботинке завершенного – Rockietto

+0

Я добавил ссылку на ответ с некоторыми примерами кода , В BroadcastReceiver, прослушивающем намерение загрузки, вы можете сбросить тревогу с помощью методов AlarmManager, таких как setRepeating, setInexactRepeating и т. Д. –