2017-09-11 1 views
2

백그라운드 서비스 작동에 문제가 있습니다. 응용 프로그램이 닫히고 전화가 잠긴 경우에도 타이머는 초당 한 번 코드를 실행해야합니다. 앱이 열려 있거나 백그라운드에서 전화가 사용 중이면이 기능은 정상적으로 작동하지만 휴대 전화가 잠겨 있고 대기 상태 인 경우 일정 시간이 지나면 서비스가 자동으로 중지됩니다.자 마린 (안드로이드). 전화가 잠겨있는 시간이 지나면 백그라운드 서비스가 중지됩니다.

코드는 예를 모델 : http://arteksoftware.com/backgrounding-with-xamarin-forms/

이 코드 MainActivity 실행된다 :

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using Android.App; 
using Android.Content; 
using Android.OS; 
using Android.Runtime; 
using Android.Views; 
using Android.Widget; 
using System.Threading; 
using System.Threading.Tasks; 
using OurAppNamespace.Classes; 
using Xamarin.Forms; 

namespace OurAppNamespace.Droid 
{ 
[Service] 
public class LongRunningTaskService : Service 
{ 
    CancellationTokenSource _cts; 

    public override IBinder OnBind(Intent intent) 
    { 
     return null; 
    } 

    public override StartCommandResult OnStartCommand(Intent intent, StartCommandFlags flags, int startId) 
    { 

     _cts = new CancellationTokenSource(); 

     Task.Run(() => 
     { 
      try 
      { 
        //INVOKE THE SHARED CODE 
        var timer = new BackgroundTimer(); 
       timer.RunBackgroundTimer(_cts.Token).Wait(); 
      } 
      catch (System.OperationCanceledException) 
      { 

      } 
      finally 
      { 
       if (_cts.IsCancellationRequested) 
       { 
        var message = new BackgroundTimerCancelledMessage(); 
        Device.BeginInvokeOnMainThread(
         () => MessagingCenter.Send(message, "BackgroundTimerCancelledMessage") 
        ); 
       } 
       StopSelf(); 
      } 

     }, _cts.Token); 
     return StartCommandResult.Sticky; 
    } 

    public override void OnCreate() 
    { 
     base.OnCreate(); 
    } 

    public override void OnDestroy() 
    { 
     if (_cts != null) 
     { 
      _cts.Token.ThrowIfCancellationRequested(); 

      _cts.Cancel(); 
     } 
     base.OnDestroy(); 
    } 
} 
} 

그리고, PCL에서 :

 MessagingCenter.Subscribe<StartBackgroundTimer>(this, "StartBackgroundTimer", message => 
     { 
      var intent = new Intent(this, typeof(LongRunningTaskService)); 
      StartService(intent); 
     }); 
     MessagingCenter.Subscribe<StopBackgroundTimer>(this, "StopBackgroundTimer", message => 
     { 
      var intent = new Intent(this, typeof(LongRunningTaskService)); 
      StopService(intent); 
     }); 

이것은 LongRunningTaskService 클래스이다 :

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading; 
using System.Threading.Tasks; 
using Xamarin.Forms; 

namespace OurAppNamespace.Classes 
{ 
public class StartBackgroundTimer { } 
public class StopBackgroundTimer { } 

public class BackgroundTimerMessage 
{ 

} 
public class BackgroundTimerCancelledMessage { } 

public class BackgroundTimer 
{ 
    public async Task RunBackgroundTimer(CancellationToken token) 
    { 
     await Task.Run(async() => 
     { 
      while (true) 
      { 
       token.ThrowIfCancellationRequested(); 
       await Task.Delay(1000); 

       Device.BeginInvokeOnMainThread(() => 
       { 
        MessagingCenter.Send<BackgroundTimerMessage>(new BackgroundTimerMessage(), "BackgroundTimer"); 
       }); 
      } 
     }, token); 
    } 
} 

} 

그리고 BackgroundTimer 호출하면 마지막으로 코드가 실행되는 :

private static void UpdateActiveTimers() 
    { 
     MessagingCenter.Subscribe<BackgroundTimerMessage>(instance, "BackgroundTimer", message => 
     { 
      (unrelated code) 
      DependencyService.Get<INotificationHandling>().UpdateTimerNotification(timeText); 
      } 
     }); 
    } 

10 분 타이머를 시작하고, 다른 전화와 다른 결과가 있습니다.

Xiaomi Redmi Note 3 Pro는 백그라운드에서 응용 프로그램으로이 코드를 실행할 수 있으며 전화기는 10 분 동안 잠겼습니다 (더 이상 테스트하지 않음).

Blackberry Priv은 백그라운드에서 앱으로 2 분 동안 정상적으로 작동하며 휴대 전화가 잠긴 후 대기 모드로 전환되면 타이머가 작동을 멈추거나 휴대 전화가 다시 켜질 때까지 알림이 더 이상 업데이트되지 않습니다. 잠금 해제가 필요하지 않음).

알림에는 타이머의 남은 시간이 표시됩니다. 휴대 전화가 잠겨있을 때 타이머가 일시 중지 된 것으로 보이고 휴대 전화가 다시 잠금 해제되면 다시 시작됩니다. 타이머에 20 분이 채로 잠기고 10 분이 지나면 전화기가 잠기면 타이머는 약 18 분 후에 다시 계산됩니다.

HOMTOM HT16은 Blackberry Priv와 동일한 동작을하지만 약 30 초 후에 타이머를 일시 중지합니다.

전화가 잠겨 있고 잠자기 상태 일 때 모든 장치에서 백그라운드 서비스가 성공적으로 실행되도록 코드를 변경하는 방법은 무엇입니까?

미리 감사드립니다.

+3

전경 서비스 사용 : https://developer.xamarin.com/guides/android/application_fundamentals/services/foreground-services/ – SushiHangover

+0

대단히 감사합니다! 전 서비스를 포 그라운드 서비스로 승격 시켰고 현재 작동 중입니다. 그것은 명백하게 들리지만, 우리는 그걸 생각해 내지 못했습니다. – Philippe

답변

0

전경 서비스 (전경 서비스에 대한 기존 서비스 홍보)를 사용하여 SushiHangover에게 감사의 말을 전하고 싶습니다.

관련 문제