2017-10-19 1 views
-2

XamarinとMqttを使用し、mqttクライアントm2mqttはAndroidライフサイクル全体で接続を維持できません。Xamarin androidでサービスを実装する方法

活動が一時停止または停止した後、あなたのプロセスが生き続けるために必要がある場合、ライフサイクルは問題が発生します

活動(電話スリープは、ユーザーがアプリケーションを切り替えて戻ってくる)サービスを使用してのアイデアは、それが残っているということです

活動がライフサイクルのどこにあるかにかかわらず、無傷である。

サービスを実装する方法を誰にでも教えてもらえますか。

答えて

0

OK、

とてもシンプルでクールです。

私は素人の説明CSHARPコーナーは、私は彼らが私はしたい、それを描写する方法にかなり近い彼らの例を使用し悪いことではありません必要なとき、私はここにc# corner

多くの時間を、私はこれを理解するために必要な情報を得ましたあなたを助けるためにあなたが3クラス 1.サービス自体(私たちはサービスを呼び出します) 2.サービスのバインダー(serviceBinder) 3.サービス接続(serviceConnection)

を必要とし、それを

を使用する方法を理解します

私はあなたを見せます私の次の(これは動作しています)、私はバインドされたサービスを設計していたので、サービスの代わりに名前で表示されます。しかし、これを実行した後、開始サービスはまったく同じように動作することが分かった。

あなたは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(); 
    } 

トーストは、あなたがあまりにもそれを望んでいなかったとき、あなたのサービスが破壊なっている場合には起こっていただきました!ちょうどあなたが知っています。

[OK]を、今、我々はサービスバインダは、(Binderは、重要な拡張)必要

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


} 

私は私の接続は、ここでパラメータをオブジェクトインスタンスに接続セキュリティの本命ですが、それは重要ではありません。私はまた、取得するプロパティを持っています。セット;私は私のオブジェクトの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(); 

関連する問題