2017-10-19 5 views
-2

Xamarin과 Mqtt를 사용하고 mqtt 클라이언트 m2mqtt는 Android 수명주기 전체에서 연결을 유지할 수 없습니다.Xamarin android에서 서비스를 구현하는 방법

활동이 일시 정지되거나 중단 후 프로세스가 살아 남기 위해 필요한 경우 수명주기가 문제를 일으킬 수

활동 (전화 잠은 사용자가 다음 응용 프로그램을 전환 되돌아 온다) 서비스를 사용하는 아이디어가 남아있는 것입니다

활동이 라이프 사이클의 어느 부분에 있든 상관없이 손상되지 않습니다.

누구든지 서비스 구현 방법을 보여 줄 수 있습니까?

답변

0

OK,

매우 쉽고 멋지다.

나는 내가 평신도의 설명 CSHARP 코너는 그들이 그것을 묘사하는 방법 난 그냥 원하는에 아주 가까이 내가 그들의 예를 사용하지 않는 나쁜 필요로 할 때 배의 여기 c# corner

많은이를 파악하는 데 필요한 정보를 가지고 당신을 돕고 당신은 3 개 클래스 1. 서비스 자체 (우리가 서비스를 호출거야) 2. 서비스 바인더 (serviceBinder) 3. 서비스 연결 (serviceConnection)

필요 그것을

을 사용하는 방법을 이해하는

내가 보여 줄께. 내 다음은 (이 작동), 나는 바운드 서비스를 설계 했으므로 서비스 대신 이름에 boundService가 표시됩니다. 그러나이 작업을 수행 한 후 시작 서비스가 정확히 동일한 방식으로 작동한다는 것을 알게되었습니다. 클래스를 다르게 시작하면 클래스가 동일합니다.

android.app가 필요합니다.

그래서 먼저 우리는 확장 서비스를 필요 (중요) 서비스를

using Android.App 

[Service] 
class MqttBoundService : Service 
{ 
    private MqttBoundServiceBinder binder; 
    public override void OnCreate() 
    { 
     base.OnCreate(); 
    } 
    public override IBinder OnBind(Intent intent) 
    { 
     binder = new MqttBoundServiceBinder(this); 
     Toast.MakeText(this, "OnBind() method start from BoundService", ToastLength.Long).Show(); 
     Toast.MakeText(this, "Bound Service is started", ToastLength.Long).Show(); 
     return binder; 
    } 
    public override bool OnUnbind(Intent intent) 
    { 
     Toast.MakeText(this, "OnUnBind() Method Called from BoundService.cs", ToastLength.Long).Show(); 
     return base.OnUnbind(intent); 
    } 
    public override void OnDestroy() 
    { 
     Toast.MakeText(this, "Bound Service Destroyed", ToastLength.Long).Show(); 
     base.OnDestroy(); 
    } 

토스트가 너무 그것을 원하지 않았을 때 서비스가 파괴지고 경우에 일어나는 뭐죠 너무 당신이 알고있다. 좋아

이제 우리는 서비스 바인더 (중요 바인더를 확장)

class MqttBoundServiceBinder : Binder 
{ 
    MqttBoundService service; 
    public MqttBoundServiceBinder(MqttBoundService service) 
    { 
     this.service = service; 
    } 
} 

지금 우리가 연결이 필요하고 무거운이 일어나는 곳이 필요합니다. 나는 아직 새로운데, 당신이 활동 라이프 사이클보다 오래 살 필요가있는 방법을 여기에 넣으려는 것처럼 보입니다.

class MqttBoundServiceConnection : Java.Lang.Object, IServiceConnection 
{ 
    public Connection connect { get; private set; } 


    public void OnServiceConnected(ComponentName name, IBinder service) 
    { 
     Console.WriteLine("OnServiceConnected() Method called"); 


    } 
    public void OnServiceDisconnected(ComponentName name) 
    { 
     Console.WriteLine("OnServiceDisConnected() Method called"); 
    } 

    public Connection Connect() 
    { 
     connect = new Connection(Utility.data, Utility.cdata); 
     return connect; 
    } 


} 

Connect에서 Connect 개체를 인스턴스화하면 여기서 매개 변수는 보안 인증서이지만 중요한 것은 아닙니다. 나는 또한 재산을 가지고있다. 세트; 내 객체에 설정하면 내 활동의 OnRestart() 및 OnResume() 함수에서 mqtt 연결에 액세스 할 수 있습니다.

저는이 작업을 수행하기 전에 안드로이드가 리소스를 전환하는 데 문제가있었습니다. 지금은 발생하지 않습니다.

가 중요한 확실하지만 내 OnRestart()는 아니 나는 그것이 나를 위해 OK 나는이 것을 의미 바운드 서비스를하고있는 중이 야 시작하는 방법을 알려하는 방법을 잊었 아

if (serviceConnection.connect == null) 
     { 
      DoBindService(); 
      connect = serviceConnection.Connect(); 
     } 
     else 
     { 
      connect = serviceConnection.connect; 
     } 

모든 활동 후 (또는 클라이언트)가 파괴되면 서비스가 파괴됩니다.

그래서 바인딩 된 서비스를 시작하려면 먼저 연결의 클래스 수준 변수를 만드십시오 (활동에서 - 위의 OnStart()에서 참조). 이렇게 또 한 번 당신은 추가 활동)

MqttBoundServiceConnection serviceConnection = new mqttBoundServiceConnection(); 

그런 다음 우리가 한 OnCreate에서 DoBindService

private void DoBindService() 
    { 
     var BoundServiceIntent = new Intent(this, typeof(MqttBoundService)); 
     BindService(BoundServiceIntent, serviceConnection, Bind.AutoCreate); 
    } 

(라는 활동하는 방법이 필요합니다 (정말 멋진)이 클래스의 메소드를 호출 할 수

DoBindService(); 

은 내가 :)

그것을 파악하면이 도움말 누군가가 나에게 도움이 희망