2016-07-25 7 views
0

직장에서 사용자가 이동하는 경로를 추적하는 앱을 만들었지 만 자동 기록 기능이 내장되어 있지만 작동하지 않습니다. 우리가 원하는 방식으로 행동합니다. 이 자동 시스템은 하루나 이틀 동안 사용하지 않으면 OS에서 꺼지는 것 같습니다 (전화기는 그 시간에 움직이지 않아 기본적으로 테스트 용으로 만 사용됩니다).Xamarin.Forms를 사용하여 iOS 및 Android의 GPS 이벤트를 통해 앱을 자동으로 시작합니다.

iOS에서는 CLRegions를 사용하여 사용자의 현재 위치 주변에 몇 개의 영역을 만들고, 사용자의 정확한 위치에 반경이 다른 5 개의 영역이 생성되고 12 개의 영역이 사용자 주위에 원을 그리며 생성됩니다 10 미터 (반경 80 미터). CLLocationManager 객체는 중요한 변경 사항과 방문을 모니터링하기 시작하도록 지시됩니다 (아직 한 번도 실행되지는 않았지만).

Android에서는 LocationServices API를 통해 지오 펜스를 사용하고 있으며 여기서 사용자의 현재 위치 주변에 5 개의 증분 반경 만 있습니다. 사용자가 Android에서 앱을 닫거나 전화를 다시 시작하면 지오 펜스를 다시 초기화하고 모니터링을 시작하는 백그라운드 서비스를 시작합니다.

두 시스템 모두 바깥에서 조금 걷는 것으로 테스트 할 때 제대로 작동하지만 하루나 이틀 동안 사용하지 않으면 (일주일 만에) 작동을 멈춘 것처럼 보입니다. 나는 지금 꽤 오랫동안 이것을 디버깅 해왔다. 비록 더 나아졌지만 아직 완벽하지는 않다.

얼마나 오랫동안 앱을 꺼도 상관없이 지오 펜스/지역이 시작될 때 백그라운드에서 앱을 자동으로 시작하는 신뢰할 수있는 시스템을 가질 수 있습니까? 두 OS 모두 백그라운드 작업을 처리하는 방법이 매우 다름을 알고 있지만 이런 식으로 GPS 사용의 장기적인 한계는 분명하지 않습니다.

, 우리가하고있는 응용 프로그램은 자 마린 양식에 기록하지만, 이러한 시스템은 안드로이드 서비스

답변

0

것은 (아직 C#을하지만, 전체 네이티브 플랫폼에 대한 전체 액세스 권한에서) 그 나라의 프로젝트로 작성되어 있다는 OS는 낮은 우선 순위로 간주되기 때문에 백그라운드 서비스를 종료 한 다음 시간 간격으로 다시 시작합니다. 이것은 며칠에 걸쳐 여러 번 발생할 수 있으며, 서비스를 다시 시작하기 전에 시간이 증가 할 때마다 (일부 전화기는 설정 시간 만 사용하고 증가하지 않습니다).

내게 제안하는 바는 항상 서비스를 원한다면 foreground service으로 만들어야한다는 것입니다. 이 코드를 구현하는 방법에 대한 몇 가지 코드 예제를 제공 하겠지만 Xamarin은 잘 모릅니다. 따라서 나쁜 예제를 제공하고 싶지는 않습니다.

또 다른 방법은 PendingIntent과 함께 AlarmManager을 사용하여 서비스가 실행 중인지 확인하고 그렇지 않은 경우 서비스를 시작하는 것입니다. 이 작업을 너무 자주하면 배터리 소모가 눈에 띄게되지만, 충분히 자주하지 않으면 지오 펜스 이벤트를 놓칠 수 있습니다.

호프가 도움이되고 행운을 빕니다.

UPDATE # 1

여기 모두 전경 서비스를 구비하고 알람 관리기를 실행하기위한 코드 샘플이다.

전경

이 제대로 살아 당신의 응용 프로그램을 유지하는 가장 쉬운 방법입니다.

public class ForegroundService extends Service{ 
    @Override 
    public int onStartCommand(Intent intent, int flags, int startId){ 
     Notification notification = new NotificationCompat.Builder(this) 
       .setSmallIcon(R.mipmap.icon) 
       .setContentTitle("TITLE") 
       .setContentText("This is an example notification!") 
       .build(); 
     startForeground(ID, notification); 
     //Do your stuff here 
    } 

    @Override 
    public void onDestroy(){ 
     super.onDestroy(); 
     stopForeground(true); 
     //If you have anything else you want done here... 
    } 
} 

알람 관리기

이 지속적으로 (이 예를 들어 10 분)으로 설정 간격으로이 서비스를 만들려고합니다. 여기 몇 가지 함정이 있습니다. 첫째, Android 6.0에서 도즈 모드를 도입했기 때문에 전화가 잠자기 상태 인 동안 AlarmManager가 실행되지 않을 수 있습니다. 이는 서비스가 상당 기간 동안 작동하지 않을 수 있음을 의미합니다. 둘째,이 함수는 여러 번 함수를 호출하기 때문에 논리를 처리해야합니다. 전경 서비스가 정말있을 수없는 한, 다음 알람 관리기가 취할 수있는 경로는, 아마도 가장 쉬운 일이 같은 서비스를 설정하는 두 가지의

public class AlwaysOnService extends Service{ 
    @Override 
    public int onStartCommand(Intent intent, int flags, int startId){ 

     AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE); 
     PendingIntent pi = PendingIntent.getService(this, requestCode, new Intent(this, AlwaysOnService.class), PendingIntent.FLAG_UPDATE_CURRENT); 
     am.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + MIN_10_IN_MILLIS, pi); 
     //Do your stuff here 
     return START_STICKY; 
    } 

    @Override 
    public void onDestroy(){ 
     super.onDestroy(); 
     AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE); 
     PendingIntent pi = PendingIntent.getService(this, requestCode, new Intent(this, AlwaysOnService.class), PendingIntent.FLAG_NO_CREATE); 
     if(pi != null){ 
      am.cancel(pi); 
      pi.cancel(); 
     } 
     //If you have anything else you want done here... 
    } 
} 

.

+0

정보를 제공해 주셔서 감사 드리며, 안드로이드에서 잠시 후 백그라운드 서비스조차도 시스템에 의해 중단 될 것이라는 것을 충분히 알지 못했습니다. 의도가 언제 멈추고 그에 따라 행동하는지 감지하는 방법이 있다고 생각합니까? 오, 그리고 자바 샘플을 쉽게 제공 할 수 있습니다. 대부분 Xamarin과 다른 언어가 아닌 다른 구문입니다. (매니페스트 옵션은 C# 코드에 정의되어 있고 컴파일러는 매니페스트 XML을 처리합니다.) – zezioen

+0

서비스가 중지되면이를 확인하는 프로세스가 필요할 것이며, 다시 죽일 수도 있습니다. 그러면 정사각형으로 돌아갑니다. 포 그라운드 서비스 및 알람 관리자가 주기적으로 서비스를 다시 시작하기 위해 코드 샘플을 사용하여 답변을 업데이트했습니다. 희망이 당신을 위해 밖으로 작동합니다! –