2016-08-26 3 views
2

데이터 서버를 폴링하고 데이터를 파싱 한 다음 인 텐트를 통해 앱으로 전송하는 Android 서비스를 작성해야합니다. 폴링은 자주 발생해야합니다 (몇 초마다). 내가 읽은 바에 따르면, 이와 같은 폴링은 배터리 수명 문제로 인해 권장되지 않습니다. 이것은 Android에서 처음 개발 한 것이며, 많은 연구를 한 후에 나에게 불분명하게 남아있는 몇 가지 사항이 있습니다.데이터 용 REST API를 지속적으로 폴링하는 Android 백그라운드 서비스 만들기

내 요구에 서비스, 동기화 어댑터 또는 경보 관리자가 더 잘 맞는지 확실하지 않습니다. 이 중 어느 것이이 문제의 맥락에서 가장 중요합니까?

이 서비스는 부팅 할 때 시작하여 백그라운드에서 계속 실행해야합니다. 서버를 폴링 한 후 인 텐트를 통해 다른 앱으로 데이터가 전송됩니다. 서비스에는 사용자 개입이 전혀 없어야합니다. 안드로이드가 맬웨어 우려로 인해 이런 종류의 글을 쓰지 못하도록 시도한 것처럼 읽은 바 있습니다. 이것을 성취 할 수 있습니까?

+2

스택 오버플로를 방문해 주셔서 감사합니다.하지만 지금까지 수행 한 작업도 확인하고 싶습니다. SO를 프리랜서 웹 사이트로 만드는 것과 같은 요구 사항이 발생 함) – Enzokie

+0

푸시 알림을 사용하거나 소켓 연결을 유지할 수있는 방법이 있습니까? 10 초가 너무 짧아서 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 단계 만들기 :을 시작하고 생성하십시오.

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

5 단계 : 시간의 모든 x 양을 실행하도록 IntentService을 예약하는 데 사용하는 AlarmManager 작업 그 후에.

질문이 있으시면 알려주세요. 모든

3

첫째, syncData() 내부 서비스 주어진 시간 간격 후 처리기를 실행합니다 클래스,

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 
     } 
    } 

을 만들 방법은 30 후 호출됩니다 REST API 호출을 넣어 초 간격. 부팅시 서비스 시작에 관한

, 부팅 예를 들어, 완료되면 서비스를 트리거하는 방송 수신기,

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

물건의 나머지는 당신에게 달려을 사용! 먼저 자신을 시험해보고 도움을 청하십시오!

+0

'SyncServer' 클래스가'onBind (Intent)'메소드를 오버라이드해야합니까? – colelemonz

관련 문제