2016-02-25 2 views
2

Я работаю над приложением, которое может проверять данные в сети каждые полчаса, и мне нужно, чтобы он продолжал работать до тех пор, пока питание включено. В настоящее время, структура моего приложения, как это:Как я могу периодически запускать службу/поток в фоновом режиме, даже когда экран заблокирован?

  1. main_activity:
    AlarmManager в onCreate()
  2. alarm_receiver:
    start_service приобретают partial_wl для службы
  3. службы:
    ПОЛУЧИТЬ сети данных используя StrictMode pop activity_2, если данные ожидаются
  4. Активность_2:
    вибрации кнопка для выхода (activity_2.this.finish())

Но в тестировании я нахожу службы перестанут (убить) после первых 30 минут. Кроме того, если я запускаю поток для работы в сети вместо использования StrictMode, он будет убит за 5 минут после закрытия экрана.

Надеюсь, кто-то может дать предложение об этом. Это действительно тревожно. Большое спасибо.

+1

Запуск справочной службы только для проверки доступности новых данных - это не очень хорошая идея. Попробуйте реализовать то же самое с помощью GCM. –

+2

Вам не нужно создавать службу. AlarmManager с неточными повторяющимися сигналами тревоги каждые полчаса будет в порядке. На самом деле это сделано * для этой цели *. Я также предлагаю уведомление, если данные доступны, вместо того, чтобы отображать действие самостоятельно. Таким образом, пользователь уведомляется и может открыть свою деятельность с уже имеющимися данными по своему усмотрению. – 323go

ответ

0

Общинное обслуживание не имеет значения, что происходит с деятельностью. если вы хотите начать периодически проверять службы шахты: https://bitbucket.org/kvrus/ocs-android/raw/036de7f0d3579b2a193bcb82309f7f82819508e6/app/src/main/java/koss/ru/oneclickrate/network/EcbEuropeService.java

/** * Нагрузки обменные курсы образуют сеть периодически * возвращает результаты в широковещательного сообщения. * Создано koss 19.02.16. */ общественного класс EcbEuropeService расширяет службу {

public static final String ECB_URL = "http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml"; 
public static final int UPDATE_PERIOD = 30000; 
public static final int UPDATE_TICK = 1000; 

public static final String NOTIFICATION = "koss.ru.oneclickrate.receiver"; 
public static final String EXTRA_CURRENCIES_MAP = "extra_currencies_map"; 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    getUrlData(); 
    return Service.START_NOT_STICKY; 
} 

@Override 
public IBinder onBind(Intent intent) { 
    return null; 
} 

public Cubes getUrlData() { 
    (new AsyncTask<Object, Object, Cubes>() { 
     Map<CurrencyType, BigDecimal> result = new EnumMap<CurrencyType, BigDecimal>(CurrencyType.class); 

     @Override 
     protected Cubes doInBackground(Object... params) { 
      Cubes cubes = new Cubes(); 
      InputStream is = null; 
      HttpURLConnection urlConnection = null; 
      try { 
       URL url = new URL(ECB_URL); 
       urlConnection = (HttpURLConnection) url.openConnection(); 
       is = urlConnection.getInputStream(); 
       cubes = EcbEuropeResponseParser.parse(is); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } finally { 
       if(urlConnection!=null) IOUtils.close(urlConnection); 
       if(is!=null) IOUtils.closeQuietly(is); 
       return cubes; 
      } 
     } 

     @Override 
     protected void onPostExecute(Cubes map) { 
      super.onPostExecute(map); 
      sendBroadcastMessage(map); 
      startTimer(); 
     } 
    }).execute(); 
    return null; 
} 

/** 
* Restarts timer 
* */ 
public void startTimer() { 
    cdt.cancel(); 
    cdt.start(); 
} 

CountDownTimer cdt = new CountDownTimer(UPDATE_PERIOD, UPDATE_TICK) { 
    @Override 
    public void onTick(long millisUntilFinished) { 

    } 

    public void onFinish() { 
     getUrlData(); 
    } 
}; 

private void sendBroadcastMessage(Cubes currenciesMap) { 
    Intent intent = new Intent(NOTIFICATION); 
    intent.putExtra(EXTRA_CURRENCIES_MAP, currenciesMap); 
    sendBroadcast(intent); 
} 
0

Я изменил несколько вещей, и это хорошо работает в настоящее время.

1. Как мой телефон 4.4.2 (api = 19), alarmmanager.setrepeating неточно. Поэтому я перехожу к использованию .setExact (новый метод .set()) и перенастроить будильник в конце AsyncTask (сети) в службе.

2.Make экземпляр wakelock global, приобретая его в AlarmReceiver и освобождая в конце AsyncTask. Я использовал, чтобы поставить .release() в onDestroy(), который освобождает блокировку до выполнения задачи.

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

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