2016-10-20 4 views
0

요구 사항은 90 초마다 위치를 기록하고 데이터베이스 (sqlite)에 기록하고 네트워크가 사용 가능한 경우 앱이 닫혀 있어도 API를 호출합니다 . 이것을 달성하는 가장 좋은 방법은 무엇입니까? 인텐시브 서비스를 시작해야합니까? 아니면 알람 관리자와 함께 가야합니다. 기간이 10 분 이상인 경우에만 알람 관리자를 사용해야한다는 어딘가를 읽었습니다.애플 리케이션이 닫힌 경우에도 매 90 초마다 안드로이드의주기적인 호출

+0

시작된 서비스 사용 –

+1

정상적인 서비스 및 처리기를 사용해 볼 수 있습니다. 핸들러는 90 초마다 필요한 작업을 수행하며 핸들러는 "START_STICKY"플래그로 시작될 경우 백그라운드에서 실행될 서비스 내부에있을 수 있습니다. –

답변

4

Device가 잠든 채로라도 실행할 수 있으므로 AlarmManager를 사용하는 것이 좋습니다. API v> 19의 경우 알람 전달이 정확하지 않으므로이를 달성하기 위해 setExact API를 사용해야합니다.

참조 참고 : API 19 년부터,이 메서드에 전달 트리거 시간이 부정확로 처리됩니다 : 알람이 시간 이전에 전달되지 않습니다,하지만 연기 될 수 있으며, 나중에 시간을 전달했다. 운영 체제는이 정책을 사용하여 전체 시스템에서 경보를 "일괄 처리"하여 장치가 "깨어나고"배터리 사용을 최소화해야하는 횟수를 최소화합니다. 일반적으로 가까운 미래에 예정된 알람은 먼 미래에 예정된 알람만큼 지연되지 않습니다. 새로운 일괄 처리 정책을 사용하면 배달 주문 보증이 이전보다 훨씬 강력 해집니다. 응용 프로그램에서 여러 개의 알람을 설정하면 이러한 알람의 실제 배달 순서가 요청한 배달 시간 순서와 일치하지 않을 수 있습니다. 응용 프로그램에 강력한 주문 요구 사항이있는 경우 필요한 동작을 수행하는 데 사용할 수있는 다른 API가 있습니다. setWindow (int, long, long, PendingIntent) 및 setExact (int, long, PendingIntent)를 참조하십시오.

0

서비스는 백그라운드에서 장기 실행 작업을 수행 할 수 있으며 사용자 인터페이스를 제공하지 않는 응용 프로그램 구성 요소입니다. 응용 프로그램이 현재 실행 중이 아닌 경우에도

알람 관리자는 특정 시간에 응용 프로그램 코드 실행을 할 경우를위한 것입니다 https://developer.android.com/guide/components/services.html

. 알람 관리자는 수신자의 onReceive() 메소드가 실행 중일 때까지 CPU 대기 모드 잠금을 유지합니다. 이렇게하면 전화가 브로드 캐스트 처리를 마칠 때까지 절전 모드가 해제됩니다.

https://developer.android.com/reference/android/app/AlarmManager.html

서비스와 이동

.

0

응용 프로그램을 닫더라도 해당 구성 요소 만 계속 듣기 때문에 인 텐트 서비스와 브로드 캐스트 수신기 구성 요소를 사용하십시오.

그리고 90 초 동안 뭔가를 얻으려면 Alarm Manager를 사용하십시오.또한 완성 된 알람 매니저 부팅을 인스턴스화해야이

public class DataSyncService extends IntentService { 


    public DataSyncService() { 
     super(DataSyncService.class.getName()); 
     // TODO Auto-generated constructor stub 
    } 

@Override 
    protected void onHandleIntent(Intent intent) { 

     //write your logic here 
     // get the location and update the database 
    } 

} 

등이

public class SyncAlarmReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 

     Intent stIntent = new Intent(context, 
        YourService.class); 
     context.startService(stIntent); 

     } 

그리고 당신의 의도 서비스 클래스처럼

AlarmManager manager = (AlarmManager) (context) 
       .getSystemService(Context.ALARM_SERVICE); 
     Intent alarmIntent = new Intent(context, YourAlarmReceuver.class); 

     //alarmIntent.putExtra("syncData", favoritesArrayList); 


     PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, 
       alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT); 
     manager.setInexactRepeating(AlarmManager.RTC_WAKEUP, 
       System.currentTimeMillis(), 90*1000, pendingIntent); 

수신기 클래스입니다.

+0

이것은 안정적으로 작동하지 않습니다. 'WakeLock'은'Service'를 위해 제공되지 않기 때문에 장치는 실행되기 전에 잠들 수 있습니다. – earthw0rmjim

+0

장치가 절전 모드에 있더라도 Alarm Manager가 작동해야합니다. 그러나 장치가 다시 시작되면 부팅이 완료되면 경보 관리자를 인스턴스화해야하므로 모든 경보가 손실됩니다. –

+0

예,'AlarmManager'는'onReceive()'중에'WakeLock'이 보장되기 때문에 작동하지만'onReceive()'가 끝난 직후 다시 잠들 수 있습니다. 그래서 수동으로 또는'WakefulBroadcastReceiver' 헬퍼 클래스를 사용하여'Service'를위한'WakeLock'을 제공해야합니다. – earthw0rmjim

1

상황에 따라 Alarm Manager가 이상적입니다. 등록 된 알람은 장치가 잠 들어있을 때까지 유지되지만 전원이 꺼지고 재부팅되면 지워집니다. 이렇게하면 90 초 간격으로 작업을 실행할 수 있습니다. 장치가 재부팅 된 후 처음으로 간격이 깨질 수 있습니다.

1

내가 발견 한 또 다른 방법은 Firebase 작업 디스패처를 사용하는 것이 었습니다. 이것은 마쉬멜로 (marshmallow) 또는 그 이상에서 실행되는 장치에 가장 적합한 옵션입니다. 통합 및 사용자 정의가 쉽습니다. https://github.com/firebase/firebase-jobdispatcher-android

관련 문제