것은 (아직 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...
}
}
.
정보를 제공해 주셔서 감사 드리며, 안드로이드에서 잠시 후 백그라운드 서비스조차도 시스템에 의해 중단 될 것이라는 것을 충분히 알지 못했습니다. 의도가 언제 멈추고 그에 따라 행동하는지 감지하는 방법이 있다고 생각합니까? 오, 그리고 자바 샘플을 쉽게 제공 할 수 있습니다. 대부분 Xamarin과 다른 언어가 아닌 다른 구문입니다. (매니페스트 옵션은 C# 코드에 정의되어 있고 컴파일러는 매니페스트 XML을 처리합니다.) – zezioen
서비스가 중지되면이를 확인하는 프로세스가 필요할 것이며, 다시 죽일 수도 있습니다. 그러면 정사각형으로 돌아갑니다. 포 그라운드 서비스 및 알람 관리자가 주기적으로 서비스를 다시 시작하기 위해 코드 샘플을 사용하여 답변을 업데이트했습니다. 희망이 당신을 위해 밖으로 작동합니다! –