2016-08-26 4 views
2

Мне нужно написать службу Android, которая опросает сервер для данных, анализирует данные и затем отправляет их в приложение через намерения. Опрос должен происходить часто (каждые несколько секунд). Из того, что я читал, опроса, подобного этому, не рекомендуется (из-за проблем с батареей). Это моя первая разработка в Android, и после проведения большого количества исследований есть несколько вещей, которые остаются неясными для меня.Создание фоновой службы Android, которая непрерывно опросает REST API для данных

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

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

+2

Благодарим вас за посещение переполнения стека, но мы также хотим увидеть, что вы сделали до сих пор. Требования к отбрасыванию звучат так, как сделать SO-сайт фриланса;) – Enzokie

+0

Есть ли способ использовать push-уведомление или поддерживать соединение сокета? десять секунд настолько мал, что ваш wi-fi/сетевой адаптер сети будет бодрствовать и разрядить аккумулятор. –

ответ

1

Чтобы определить событие загрузки с использованием фильтра BOOT_COMPLETED, необходимо использовать BroadcastReceiver. Затем вам нужно будет запустить IntentService, чтобы запросить ваш сервис.

Шаг 1: Добавьте разрешение на свой манифест

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

Шаг 2: Зарегистрировать сервис

<receiver android:name="com.myapp.BootReceiver"> 
    <intent-filter> 
    <action android:name="android.intent.action.BOOT_COMPLETED" /> 
    </intent-filter> 
</receiver> 

Шаг 3: Создайте свой BootReceiver

public class BootReceiver extends BroadcastReceiver { 

@Override 
public void onReceive(Context context, Intent intent) { 
    if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) { 
     // Start your intent service 
     ... 
    } 
    } 
} 

Шаг 4 : Запустите и создайте свой IntentService

...  
Intent i = new Intent(context, BackgroundService.class); 
context.startService(i); 
... 

Шаг 5: После того, что работает Используйте AlarmManager запланировать IntentService запускать каждый x количество времени.

Дайте мне знать, если у вас есть еще вопросы!

3

Прежде всего, создать класс обслуживания, который будет выполняться обработчик после заданного интервала времени,

public class SyncService extends Service { 

    private Handler mHandler; 
    // default interval for syncing data 
    public static final long DEFAULT_SYNC_INTERVAL = 30 * 1000; 

     // task to be run here 
     private Runnable runnableService = new Runnable() { 
      @Override 
      public void run() { 
       syncData(); 
       // Repeat this runnable code block again every ... min 
       mHandler.postDelayed(runnableService, Constant.DEFAULT_SYNC_INTERVAL); 
      } 
     }; 

     @Override 
     public int onStartCommand(Intent intent, int flags, int startId) { 
      // Create the Handler object 
      mHandler = new Handler(); 
      // Execute a runnable task as soon as possible 
      mHandler.post(runnableService); 

      return START_STICKY; 
     } 

     private synchronized void syncData() { 
      // call your rest service here 
     } 
    } 

Внутри syncData() метод поставить API вызова REST, который будет вызван после 30 сек.

Что касается запуска службы при загрузке, используйте широковещательный приемник, который будет вызывать службу после того, как загрузочный будет завершена, например,

<receiver android:name=".BootCompletedIntentReceiver"> 
     <intent-filter> 
      <action android:name="android.intent.action.BOOT_COMPLETED" /> 
     </intent-filter> 
    </receiver> 

Остальные вещи к вам! Сначала попробуйте сами и попросите о помощи!

+0

Нужно ли классу 'SyncServer' переопределять метод' onBind (Intent) '? – colelemonz