2017-10-19 2 views
-2

mithilfe von Xamarin und Mqtt und mein mqtt-Client m2mqtt ist nicht in der Lage, eine Verbindung über den gesamten Android-Lebenszyklus aufrecht zu erhalten.So implementieren Sie einen Dienst in Xamarin android

Aktivität Lebenszyklus zu Problemen führen, wenn der Prozess am Leben bleiben muss, nachdem die Aktivität oder gestoppt pausiert hat (Telefon schläft, User-Anwendungen schaltet dann kommt zurück)

Die Idee, einen Dienst zu verwenden, ist, dass es bleiben wird unabhängig davon, wo sich die Aktivität im Lebenszyklus befindet.

Kann mir jemand zeigen, wie man einen Service einführt.

Antwort

0

OK,

Es ist sehr einfach und wirklich irgendwie cool.

bekam ich die Informationen, die ich brauchte diese hier, um herauszufinden, c# corner

eine Menge Zeit, wenn ich eine Beschreibung csharp Ecke des Laien brauchen nicht schlecht habe ich ihr Beispiel ziemlich nah an, wie sie es porträtiert ich nur wollen um Ihnen zu helfen zu verstehen, wie es

verwenden Sie müssen 3 Klassen 1. der Dienst selbst (wir nennen es Service) 2. Service-Binder (serviceBinder) 3. Service-Verbindung (serviceConnection)

Ich werde es dir zeigen Meine nächste (das funktioniert), ich entwarf einen gebundenen Dienst, daher werden Sie in den Namen sehen, statt Service heißt es gebundener Service. Nachdem ich das getan habe, habe ich herausgefunden, dass ein Start-Service genau so funktioniert, wie Sie ihn starten. Die Klassen sind gleich.

Sie benötigen android.app.

Also zuerst müssen wir den Service erstreckt sich: Service (wichtig)

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(); 
    } 

Der Toast ist es nur damit Sie wissen, was ist, wenn Ihr Dienst geschieht zerstört wurden, wenn Sie es nicht wollen.

Ok jetzt müssen wir die Service-Binder (Verlängert Binder wichtig)

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

jetzt müssen wir die Verbindung und das ist, wo das Heben schwerer Lasten stattfindet. Ich bin immer noch neu, aber es sieht so aus, als ob Sie die Methoden hier einsetzen wollen, die den Aktivitätslebenszyklus überstehen müssen.

in der Methode Verbinden ich instanziiere meine Verbindung Objekt die Parameter hier sind Sicherheitszertifikate, aber das ist nicht wichtig. Ich habe auch eine Eigenschaft mit bekommen; einstellen; dass ich auf mein Objekt setze, damit ich in meinen OnRestart() - und OnResume() - Funktionen meiner Aktivität auf die mqtt-Verbindung zugreifen kann.

Ich hatte Probleme mit Ressourcen, die von Android umgeleitet werden, bevor ich dies tat, und das passiert jetzt nicht.

Nicht sicher, ob es darauf ankommt, aber das ist mein OnRestart()

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

Oh, ich vergaß, wie Sie sagen, wie es für mich OK, um ich einen gebundenen Dienst tue dies bedeutet, dass nach all den Aktivitäten (oder Clients), die es verwenden, werden zerstört, der Dienst wird zerstört.

Um einen gebundenen Service zu starten, erstellen Sie zuerst eine Variable auf Klassenebene für die Verbindung (in der Aktivität - es wird in meinem OnStart() oben referenziert). Auch wenn Sie dies tun, können Sie die Methoden dieser Klasse aufrufen (wirklich cool)

MqttBoundServiceConnection serviceConnection = new mqttBoundServiceConnection(); 

Dann brauchen wir eine Methode in der Aktivität DoBindService

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

in der OnCreate() für die Aktivität genannt hinzufügen

DoBindService(); 

ich hoffe, diese Hilfe jemand es mir geholfen, wenn ich es :)

heraus
Verwandte Themen