2015-09-25 2 views
0

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

У меня есть что-то вместе, которое использует AlarmManager.SetInexactRepeating() для вызова IntentService, который выполняет синхронизацию и вставляет/обновляет данные в базе данных. Это работает, когда приложение находится на переднем плане и на заднем плане, но если я принудительно остановлю приложение, я продолжаю видеть сообщения «К сожалению, прекратил работу», когда срабатывал будильник AlarmManager. В этом случае мне остается только проверять новые данные только тогда, когда приложение работает на переднем плане или в фоновом режиме.

Моя первая мысль - обнаружить, когда приложение закрыто, и остановить будильник, но это не представляется возможным. Поэтому я спрашиваю здесь, мой подход неправильный? Если да, то какой подход используется для выполнения некоторой периодической задачи, независимо от того, находится ли телефон на переднем плане или на заднем плане? Проблема с решением AlarmManager, которое я использую, это тревога, которая продолжает срабатывать, даже когда приложение закрыто.

ответ

2

Если ваша идея - проверить, есть ли у вашего API новые данные и выполнить фоновое синхронизацию с локальной базой данных или другим хранилищем данных, я думаю, вы хотели бы взглянуть на это :

Creating a Sync Adapter

Running a Sync Adapter

адаптер синхронизации является рекомендуемым способом достижения этой цели в Android. Плюсы использования его многообразны:

  • Оптимизации из коробки - ОС Связки вызовов, использует наиболее подходящие окна для запуска синхронизации адаптера при минимальной ширине полосы и стоят батареи
  • Жизненный цикл фона компонент синхронизации управляется внутренне с помощью ОС
  • Наблюдатели могут быть уведомлены, когда данные были изменены, поэтому пользовательский интерфейс может быть легко обновлен
  • Несколько способов запуска синхронных интервалов, автоматически с сообщением ОС, чтобы сохранить TCP/IP соединения открыты или по запросу

Однако реализация этого требует некоторых вещей, которые могут вызвать немного боли в первом:

  • Это является обязательным, что адаптер работает с ContentProvider
  • Адаптеров синхронизации использует учетную запись для проверки подлинности. Если это не требуется, необходимо предусмотреть заглушку
2

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

1

Использование сервиса - это правильный путь. Попросите приложение запустить службу, и она будет продолжена, пока приложение находится на переднем плане или в фоновом режиме. Затем, если вы хотите убить Сервис, когда ваше приложение закроется, вы можете просто позвонить stopService(yourServiceIntent); из onDestroy() переопределить активность вашего приложения. Это должно эффективно отключать службу, когда приложение закрывается.

Так некоторые примеры код, как это работает (взят из Services Документов) ...

Службы (только Регистрирует сообщение каждой 1 секунду в течение 60 секунд):

public class MyService extends Service { 
    private Looper mServiceLooper; 
    private ServiceHandler mServiceHandler; 

    // Handler that receives messages from the thread 
    private final class ServiceHandler extends Handler { 
     public ServiceHandler(Looper looper) { 
      super(looper); 
     } 
     @Override 
     public void handleMessage(Message msg) { 

      long endTime = System.currentTimeMillis() + 60*1000; 
      while (System.currentTimeMillis() < endTime) { 
       synchronized (this) { 
        try { 
         wait(1000); 
         Log.d("SERVICE", "The service is still running."); 
        } catch (Exception e) { 
         e.printStackTrace(); 
        } 
       } 
      } 

      stopSelf(msg.arg1); 
     } 
    } 

    @Override 
    public void onCreate() { 

     HandlerThread thread = new HandlerThread("ServiceStartArguments", Process.THREAD_PRIORITY_BACKGROUND); 
     thread.start(); 

     mServiceLooper = thread.getLooper(); 
     mServiceHandler = new ServiceHandler(mServiceLooper); 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 

     Message msg = mServiceHandler.obtainMessage(); 
     msg.arg1 = startId; 
     mServiceHandler.sendMessage(msg); 

     return START_NOT_STICKY; 
    } 

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

    @Override 
    public void onDestroy() { 

    } 
} 

И в вашей деятельности вы бы сделали что-то вроде:

public class MainActivity extends AppCompatActivity { 

    Intent serviceIntent; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     serviceIntent = new Intent(this, MyService.class); 
     startService(serviceIntent); 
    } 

    @Override 
    protected void onDestroy() { 
     stopService(serviceIntent); 
     super.onDestroy(); 
    } 
+0

Сохраняется ли эта услуга, когда приложение закрыто пользователем или ОС? Это то, что я пытаюсь решить. IntentService, вызываемый AlarmManager, продолжает работать до перезагрузки. Я просто хочу запускать свою периодическую фоновое задание, пока приложение работает на переднем плане или в фоновом режиме. –

+0

@Trevor Balcom - Да, это решение позволит службе запускаться во время работы приложения (на переднем плане или в фоновом режиме), но отключит службу, когда приложение будет закрыто пользователем или ОС. Кроме того, вы хотите убедиться и вернуть START_NOT_STICKY из вашего метода onStartCommand() в свою службу, чтобы, если ОС отключит службу, она не будет автоматически перезагружена. – NoChinDeluxe

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